Update Balls.cpp

This commit is contained in:
Alan-CRL 2024-01-31 09:55:46 +08:00 committed by GitHub
parent 09bb61857d
commit 5848ce7da2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,20 +1,20 @@
/**
* @brief
* @note HiCanvas
* @author huidong <mailhuid@163.com>
* @version HiEasyX Ver0.3.2
* @date 2023.01.12
* @brief
* @note HiCanvas
* @author huidong<mailhuid@163.com> alan-crl<alan-crl@foxmail.com>
* @version HiEasyX Ver0.4.1
* @date 2024.01.31
*/
#include "HiEasyX.h"
// 小球数量
// 小球数量
#define BALL_NUM 14
// 小球半径
// 小球半径
#define RADIUS 70
// 球体
// 球体
struct Ball
{
hiex::ImageBlock img;
@ -22,39 +22,39 @@ struct Ball
float vx, vy;
};
hiex::SysButton btn; // 按钮
bool show_outline = false; // 是否显示轮廓
hiex::SysButton btn; // 按钮
bool show_outline = false; // 是否显示轮廓
int main()
{
hiex::Window wnd(640, 480); // 创建窗口
hiex::Canvas canvas; // 创建画布对象
wnd.BindCanvas(&canvas); // 将窗口和画布绑定
hiex::Window wnd(640, 480); // 创建窗口
hiex::Canvas canvas; // 创建画布对象
wnd.BindCanvas(&canvas); // 将窗口和画布绑定
// 手动刷新双缓冲
// 手动刷新双缓冲
//hiex::EnableAutoFlush(false);
canvas.Clear(true, BLACK); // 设置背景色为黑色,清空画布
canvas.Clear(true, BLACK); // 设置背景色为黑色,清空画布
// 创建按钮,用于点击设置是否显示轮廓
// 创建按钮,用于点击设置是否显示轮廓
btn.Create(wnd.GetHandle(), 50, 50, 120, 30, L"Hide outline");
btn.RegisterMessage([]() {
show_outline = !show_outline;
btn.SetText(show_outline ? L"Show outline" : L"Hide outline");
btn.SetText(show_outline ? L"Show outline" : L"Hide outline");
});
// 初始化随机数
// 初始化随机数
srand((UINT)time(nullptr));
hiex::Scene scene; // 场景
hiex::Layer layer; // 图层
hiex::Scene scene; // 场景
hiex::Layer layer; // 图层
Ball balls[BALL_NUM]; // 小球
Ball balls[BALL_NUM]; // 小球
// 初始化小球
// 初始化小球
for (auto& i : balls)
{
// 位置和速度的初始化
// 位置和速度的初始化
i.x = (float)(rand() % canvas.GetWidth());
i.y = (float)(rand() % canvas.GetHeight());
i.vx = rand() % 5 * (rand() % 2 ? 2.0f : -2.0f);
@ -64,24 +64,24 @@ int main()
if (i.vy == 0)
i.vy = 3;
// 小球的图像块设置
// 小球的图像块设置
i.img.CreateCanvas(RADIUS * 2, RADIUS * 2);
i.img.GetCanvas()->Clear();
i.img.GetCanvas()->SolidCircle(RADIUS, RADIUS, RADIUS, true, rand() % 0xffffff);
ReverseAlpha(i.img.GetCanvas()->GetBuffer(), i.img.GetCanvas()->GetBufferSize());
// 设置图像块透明度
// 设置图像块透明度
i.img.alpha = 200;
i.img.bUseSrcAlpha = true;
// 加入图像块到图层
// 加入图像块到图层
layer.push_back(&i.img);
}
// 加入图层到场景
// 加入图层到场景
scene.push_back(&layer);
// 主循环(窗口关闭或按下按键时退出)
// 主循环(窗口关闭或按下按键时退出)
while (wnd.IsAlive() && !peekmessage(nullptr, EM_CHAR))
{
for (auto& i : balls)
@ -89,7 +89,7 @@ int main()
i.x += i.vx;
i.y += i.vy;
// 碰撞判定
// 碰撞判定
if (i.x - RADIUS < 0)
{
i.x = RADIUS;
@ -111,24 +111,25 @@ int main()
i.vy = -i.vy;
}
// 更新位置
// 更新位置
i.img.SetPos((int)i.x - RADIUS, (int)i.y - RADIUS);
}
if (wnd.BeginTask())
{
// 渲染场景
// 渲染场景
scene.Render(canvas.GetImagePointer(), show_outline);
// 手动刷新双缓冲
// 手动刷新双缓冲
//wnd.FlushDrawing();
wnd.EndTask();
wnd.Redraw();
}
// 平衡帧率
hiex::DelayFPS(24);
// 平衡帧率
static hiex::tDelayFPS recond;
hiex::DelayFPS(recond, 24);
}
return 0;