目录

Dx系列教程2

Dx系列教程2

  • ImGui的基础使用
  • ImGui主题配置
  • ImGui字体资源使用
  • 实现目标:学会使用ImGui内部控件 绘制默认提供的几何图形和字符串

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/JaUGvzDmjaYuogbBdKfMUepNvh_RRdUGJnk_RPbsPxeSEswW8CbMESIU_wglJWYsNXGZoyWJFq2OnY2G6wELE-F4YvUdLb_jk0SaU9SB6X67-ar-ek6gr925jj_PFK3gwbkx398OM-pOmlTWg7A.png

内存加载字体注意需要提供参数:

1
2
3
4
//字体配置  
ImFontConfig f_cfg;  
f_cfg.FontDataOwnedByAtlas = false; 
const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 18.0f,&f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());

参考源码1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ImGui::Begin(u8"你好世界 Hello, world!");
ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None;   
if (ImGui::BeginTabBar(u8"mytab", tab_bar_flags))    
{  
  if (ImGui::BeginTabItem("tab1"))     
  {     
    ImGui::Text(u8"这里是1的内容");    
    ImGui::EndTabItem();     
  }     
  if (ImGui::BeginTabItem("tab2"))    
  {
    ImGui::Text(u8"这里是2的内容");  
    ImGui::EndTabItem();      
  }
  if (ImGui::BeginTabItem("tab3"))   
  {       
    ImGui::Text(u8"这里是3的内容");   
    ImGui::EndTabItem();      
  }
  ImGui::EndTabBar();   
}

ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);  
ImGui::End();

 
std::string str = u8"abcdefg123456绘制字符串";

auto drawList = ImGui::GetOverlayDrawList();    
drawList->AddRectFilled({ 100.f,100.f }, {200.f,200.f}, ImColor(255,96, 0, 255), 5.f);    
drawList->AddText(font, 25.f, { 250.f,100.f }, ImColor(255, 96, 0, 255), str.c_str());

参考源码2 (手动锁帧):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
class DxTimeControl
{
public:	
  //初始化函数	
  DxTimeControl()
  {
    s_tStart = s_tFixed = s_tLast = s_tNow = std::chrono::steady_clock::now();	
    s_tExceptedInvertal = std::chrono::milliseconds(15);	
  }
  //初始化函数	
  DxTimeControl(int ms)	
  {
    ms = (ms < 0 || ms > 20) ? 15 : ms;	
    s_tStart = s_tFixed = s_tLast = s_tNow = std::chrono::steady_clock::now();	
    s_tExceptedInvertal = std::chrono::milliseconds(ms);
  }
  //析构函数	
  ~DxTimeControl()
  {
  }
  // 获取上一帧与当前帧的时间间隔(秒)	
  float getDeltaTime()
  {
    return std::chrono::duration_cast<std::chrono::microseconds>(s_tNow - s_tLast).count() / 1000.f / 1000.f;	}
  // 获取上一帧与当前帧的时间间隔(毫秒)	
  unsigned int getDeltaTimeMilliseconds()	
  {		
    return static_cast<unsigned int>(std::chrono::duration_cast<std::chrono::milliseconds>(s_tNow - s_tLast).count());	
  }
  // 获取游戏总时长(秒)	
  float getTotalTime()	
  {
    return std::chrono::duration_cast<std::chrono::microseconds>(s_tNow - s_tStart).count() / 1000.f / 1000.f;	
  }
  // 获取游戏总时长(毫秒)
  unsigned int getTotalTimeMilliseconds()
  {
    return static_cast<unsigned int>(std::chrono::duration_cast<std::chrono::milliseconds>(s_tNow - s_tStart).count());
  }
  // 循环周期	
  void cycleTime(int ms) 
  {
    s_tExceptedInvertal = std::chrono::milliseconds(ms);	
  };
  // 是否达到更新时间	
  bool isReady()	
  {
    return s_tExceptedInvertal < std::chrono::duration_cast<std::chrono::milliseconds>(s_tNow - s_tFixed);
  }
  // 更新当前时间	
  void updateNow()	
  {
    // 刷新时间	
    s_tNow = std::chrono::steady_clock::now();
  }
  // 更新时间信息
  void updateLast()	
  {
    s_tFixed += s_tExceptedInvertal;
    
		s_tLast = s_tNow;
    s_tNow = std::chrono::steady_clock::now();	
  }
  // 重置时间信息	
  void reset()	
  {
    s_tLast = s_tFixed = s_tNow = std::chrono::steady_clock::now();
  }
  // 挂起线程
  void sleep()
  {		
    // 计算挂起时长		
    int nWaitMS = s_tExceptedInvertal.count() - static_cast<int>(std::chrono::duration_cast<std::chrono::milliseconds>(s_tNow - s_tFixed).count());
    
		if (nWaitMS > 1)	
    {
      // 挂起线程,释放 CPU 占用			
      std::this_thread::sleep_for(std::chrono::milliseconds(nWaitMS));	
    }
  }
private:	
  // 游戏开始时间	
  std::chrono::steady_clock::time_point s_tStart;
  // 当前时间	
  std::chrono::steady_clock::time_point s_tNow;	
  // 上一帧刷新时间	
  std::chrono::steady_clock::time_point s_tLast;
  // 固定的刷新时间	
  std::chrono::steady_clock::time_point s_tFixed;	
  // 每一帧间隔	
  std::chrono::milliseconds s_tExceptedInvertal;
};

TODO: 下节课要讲dx了,大家看下什么时dx的顶点缓存 学会使用std的一些东西,自己写个类,重写运算符TODO: 了解下11的特性 遍历器是什么,有什么用