HiEasyX  Ver 0.3.0
EasyX 全面扩展库
main.cpp
浏览该文件的文档.
1 
8 #include "HiEasyX.h"
9 
10 // 小球数量
11 #define BALL_NUM 14
12 
13 // 小球半径
14 #define RADIUS 70
15 
16 // 球体
17 struct Ball
18 {
20  float x, y;
21  float vx, vy;
22 };
23 
24 hiex::SysButton btn; // 按钮
25 bool show_outline = false; // 是否显示轮廓
26 
27 int main()
28 {
29  hiex::Window wnd(640, 480); // 创建窗口
30  hiex::Canvas canvas; // 创建画布对象
31  wnd.BindCanvas(&canvas); // 将窗口和画布绑定
32 
33  // 手动刷新双缓冲
34  //hiex::EnableAutoFlush(false);
35 
36  canvas.Clear(true, BLACK); // 设置背景色为黑色,清空画布
37 
38  // 创建按钮,用于点击设置是否显示轮廓
39  btn.Create(wnd.GetHandle(), 50, 50, 120, 30, L"Hide outline");
40  btn.RegisterMessage([]() {
42  btn.SetText(show_outline ? L"Show outline" : L"Hide outline");
43  });
44 
45  // 初始化随机数
46  srand((UINT)time(nullptr));
47 
48  hiex::Scene scene; // 场景
49  hiex::Layer layer; // 图层
50 
51  Ball balls[BALL_NUM]; // 小球
52 
53  // 初始化小球
54  for (auto& i : balls)
55  {
56  // 位置和速度的初始化
57  i.x = (float)(rand() % canvas.GetWidth());
58  i.y = (float)(rand() % canvas.GetHeight());
59  i.vx = rand() % 5 * (rand() % 2 ? 2.0f : -2.0f);
60  i.vy = rand() % 5 * (rand() % 2 ? 2.0f : -2.0f);
61  if (i.vx == 0)
62  i.vx = 3;
63  if (i.vy == 0)
64  i.vy = 3;
65 
66  // 小球的图像块设置
67  i.img.CreateCanvas(RADIUS * 2, RADIUS * 2);
68  i.img.GetCanvas()->Clear();
69  i.img.GetCanvas()->SolidCircle(RADIUS, RADIUS, RADIUS, true, rand() % 0xffffff);
70  ReverseAlpha(i.img.GetCanvas()->GetBuffer(), i.img.GetCanvas()->GetBufferSize());
71 
72  // 设置图像块透明度
73  i.img.alpha = 200;
74  i.img.bUseSrcAlpha = true;
75 
76  // 加入图像块到图层
77  layer.push_back(&i.img);
78  }
79 
80  // 加入图层到场景
81  scene.push_back(&layer);
82 
83  // 主循环(窗口关闭或按下按键时退出)
84  while (wnd.IsAlive() && !peekmessage(nullptr, EM_CHAR))
85  {
86  for (auto& i : balls)
87  {
88  i.x += i.vx;
89  i.y += i.vy;
90 
91  // 碰撞判定
92  if (i.x - RADIUS < 0)
93  {
94  i.x = RADIUS;
95  i.vx = -i.vx;
96  }
97  if (i.x + RADIUS > canvas.GetWidth())
98  {
99  i.x = (float)canvas.GetWidth() - RADIUS;
100  i.vx = -i.vx;
101  }
102  if (i.y - RADIUS < 0)
103  {
104  i.y = RADIUS;
105  i.vy = -i.vy;
106  }
107  if (i.y + RADIUS > canvas.GetHeight())
108  {
109  i.y = (float)canvas.GetHeight() - RADIUS;
110  i.vy = -i.vy;
111  }
112 
113  // 更新位置
114  i.img.SetPos((int)i.x - RADIUS, (int)i.y - RADIUS);
115  }
116 
117  if (wnd.BeginTask())
118  {
119  // 渲染场景
120  scene.Render(canvas.GetImagePointer(), show_outline);
121 
122  // 手动刷新双缓冲
123  //wnd.FlushDrawing();
124 
125  wnd.EndTask();
126  wnd.Redraw();
127  }
128 
129  // 平衡帧率
130  hiex::DelayFPS(24);
131  }
132 
133  return 0;
134 }
HiEasyX::Window::BindCanvas
void BindCanvas(Canvas *pCanvas)
Definition: HiWindow.cpp:1749
HiEasyX::Canvas::GetHeight
int GetHeight() const
Definition: HiCanvas.h:282
ReverseAlpha
DWORD * ReverseAlpha(DWORD *pBuf, int size)
Definition: HiFunc.cpp:37
HiEasyX::Window
窗口
Definition: HiWindow.h:118
Ball::x
float x
Definition: main.cpp:20
BALL_NUM
#define BALL_NUM
透明小球边界碰撞示例
Definition: main.cpp:11
HiEasyX::Window::BeginTask
bool BeginTask()
Definition: HiWindow.cpp:1772
HiEasyX::Canvas::GetImagePointer
IMAGE * GetImagePointer()
Definition: HiCanvas.h:257
Ball::y
float y
Definition: main.cpp:20
Ball::vy
float vy
Definition: main.cpp:21
btn
hiex::SysButton btn
Definition: main.cpp:24
HiEasyX::Window::EndTask
void EndTask(bool flush=true)
Definition: HiWindow.cpp:1784
HiEasyX::DelayFPS
void DelayFPS(int fps, bool wait_long)
根据目标帧率延时
Definition: HiFPS.cpp:11
HiEasyX::Scene::Render
void Render(IMAGE *pImg=nullptr, bool bShowAllOutline=false, bool bShowAllText=true)
渲染到画布
Definition: HiCanvas.cpp:2028
RADIUS
#define RADIUS
Definition: main.cpp:14
HiEasyX::Canvas
画布
Definition: HiCanvas.h:117
peekmessage
#define peekmessage
Definition: HiWindow.h:870
HiEasyX::Canvas::Clear
void Clear(bool isSetColor=false, COLORREF bkcolor=BLACK)
Definition: HiCanvas.cpp:465
HiEasyX::Window::IsAlive
bool IsAlive()
Definition: HiWindow.cpp:1734
main
int main()
Definition: main.cpp:27
HiEasyX::Window::GetHandle
HWND GetHandle()
Definition: HiWindow.cpp:1724
Ball
Definition: main.cpp:17
HiEasyX::SysControlBase::Create
HWND Create(HWND hParent, RECT rct, std::wstring strText=L"")
Definition: SysControlBase.cpp:58
HiEasyX::Layer
图层
Definition: HiCanvas.h:835
HiEasyX::SysControlBase::SetText
void SetText(std::wstring wstr)
Definition: SysControlBase.cpp:137
HiEasyX::SysButton
系统按钮控件
Definition: SysButton.h:18
HiEasyX.h
HiEasyX 库头文件
show_outline
bool show_outline
Definition: main.cpp:25
HiEasyX::Window::Redraw
void Redraw()
重绘窗口
Definition: HiWindow.cpp:1848
HiEasyX::Canvas::GetWidth
int GetWidth() const
Definition: HiCanvas.h:281
HiEasyX::ImageBlock
图像块
Definition: HiCanvas.h:771
Ball::img
hiex::ImageBlock img
Definition: main.cpp:19
HiEasyX::Scene
Definition: HiCanvas.h:876
Ball::vx
float vx
Definition: main.cpp:21
HiEasyX::SysButton::RegisterMessage
void RegisterMessage(void(*pFunc)())
注册点击消息
Definition: SysButton.cpp:48