Dx系列教程2
- ImGui的基础使用
- ImGui主题配置
- ImGui字体资源使用
- 实现目标:学会使用ImGui内部控件 绘制默认提供的几何图形和字符串
内存加载字体注意需要提供参数:
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的特性 遍历器是什么,有什么用