-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtriangle.cpp
More file actions
152 lines (130 loc) · 4.45 KB
/
triangle.cpp
File metadata and controls
152 lines (130 loc) · 4.45 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**
* Triangle Component
*
* 最小化的三角形渲染示例
* 演示如何使用 BitHCI Runtime API 创建一个简单的图形组件
*/
#include "runtime_api.h"
#include <cmath>
class TriangleComponent : public BitHCI::IComponent {
private:
// 运行时接口
BitHCI::IRenderer* renderer = nullptr;
BitHCI::IInput* input = nullptr;
BitHCI::IWindow* window = nullptr;
// 组件状态
float rotation = 0.0f;
float scale = 1.0f; // 缩放因子 (1.0 = 200px 高度)
bool isPaused = false;
// 三角形顶点(相对于中心的偏移,像素单位)
// ✅ 使用像素坐标而不是归一化坐标
float baseVertices[9] = {
0.0f, -100.0f, 0.0f, // 顶部(向上 100px)
-100.0f, 100.0f, 0.0f, // 左下(向左 100px,向下 100px)
100.0f, 100.0f, 0.0f // 右下(向右 100px,向下 100px)
};
float colors[9] = {
1.0f, 0.0f, 0.0f, // 红色
0.0f, 1.0f, 0.0f, // 绿色
0.0f, 0.0f, 1.0f // 蓝色
};
public:
/**
* 组件初始化
* 保存运行时接口引用
*/
void onInit(BitHCI::IWindow* window,
BitHCI::IRenderer* renderer,
BitHCI::IInput* input,
BitHCI::IResourceManager* resources) override {
this->window = window;
this->renderer = renderer;
this->input = input;
// 设置清屏颜色
renderer->setClearColor(0.1f, 0.1f, 0.1f, 1.0f);
}
/**
* 组件更新
* 处理旋转动画和用户输入
*/
void onUpdate(float deltaTime) override {
// 空格键暂停/继续
if (input->isKeyJustPressed(32)) { // 空格键
isPaused = !isPaused;
}
// 上下键控制缩放
if (input->isKeyPressed(38)) { // 上箭头
scale += deltaTime * 1.0f;
if (scale > 3.0f) scale = 3.0f;
}
if (input->isKeyPressed(40)) { // 下箭头
scale -= deltaTime * 1.0f;
if (scale < 0.2f) scale = 0.2f;
}
// R 键重置
if (input->isKeyJustPressed(82)) { // R 键
rotation = 0.0f;
scale = 1.0f;
isPaused = false;
}
// 旋转动画
if (!isPaused) {
rotation += deltaTime * 45.0f; // 45度/秒
if (rotation >= 360.0f) {
rotation -= 360.0f;
}
}
}
/**
* 组件渲染
* 绘制旋转的三角形
*/
void onRender() override {
// ✅ 获取窗口中心(左上角为原点的像素坐标系)
int windowW = window->getWidth();
int windowH = window->getHeight();
float centerX = windowW / 2.0f;
float centerY = windowH / 2.0f;
// 应用旋转和缩放
float angle = rotation * 3.14159f / 180.0f;
float cosA = std::cos(angle);
float sinA = std::sin(angle);
float transformedVertices[9];
for (int i = 0; i < 3; i++) {
// 应用缩放
float x = baseVertices[i * 3 + 0] * scale;
float y = baseVertices[i * 3 + 1] * scale;
// 应用旋转矩阵
float rotX = x * cosA - y * sinA;
float rotY = x * sinA + y * cosA;
// ✅ 转换为屏幕坐标(原点在左上角)
transformedVertices[i * 3 + 0] = centerX + rotX;
transformedVertices[i * 3 + 1] = centerY + rotY;
transformedVertices[i * 3 + 2] = 0.0f;
}
// 绘制三角形
renderer->drawTriangle(transformedVertices, colors);
// 绘制说明文字
float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
renderer->drawText("Triangle Component Demo", 10, 10, white, 16.0f);
renderer->drawText("[Space] Pause/Resume", 10, 30, white, 12.0f);
renderer->drawText("[Up/Down] Scale", 10, 45, white, 12.0f);
renderer->drawText("[R] Reset", 10, 60, white, 12.0f);
}
/**
* 组件销毁
* 清理资源
*/
void onDestroy() override {
// 这个简单示例没有需要清理的资源
}
/**
* 键盘事件(可选)
*/
void onKeyEvent(int key, bool pressed) override {
// 可以在这里处理按键事件
// 本示例在 onUpdate 中处理
}
};
// 导出组件创建函数
BITHCI_COMPONENT(TriangleComponent)