教程来源:【从零开始的C++游戏开发】EasyX开发环境搭建 | 跟随鼠标移动的小球_哔哩哔哩_bilibili
绘图资源库:EasyX
EasyX Graphics Library for C++
1.项目基本框架
2.相关组件
#include <graphics.h> // 引用图形库头文件
使用该头文件即可使用EasyX相关功能。
3.初始化绘制窗口:
将初始窗口代码写在while主循环之前,在循环结束前保持窗口存在。
4.读取鼠标移动信息
鼠标信息结构体定义如下:
struct ExMessage
{
USHORT message; // 消息标识
union
{
// 鼠标消息的数据
struct
{
bool ctrl :1; // Ctrl 键是否按下
bool shift :1; // Shift 键是否按下
bool lbutton :1; // 鼠标左键是否按下
bool mbutton :1; // 鼠标中键是否按下
bool rbutton :1; // 鼠标右键
short x; // 鼠标的 x 坐标
short y; // 鼠标的 y 坐标
short wheel; // 鼠标滚轮滚动值,为 120 的倍数
};
// 按键消息的数据
struct
{
BYTE vkcode; // 按键的虚拟键码
BYTE scancode; // 按键的扫描码(依赖于 OEM)
bool extended :1; // 按键是否是扩展键
bool prevdown :1; // 按键的前一个状态是否按下
};
// 字符消息的数据
TCHAR ch;
// 窗口消息的数据
struct
{
WPARAM wParam;
LPARAM lParam;
};
};
};
在主循环中再定义一个接受鼠标位置的循环,判断条件为当前鼠标动作为鼠标移动。
循环内接受当前鼠标位置坐标。
5.绘制图形
以鼠标位置坐标为参数绘制实心圆即可,使用circle()函数。但是这样绘制完的圆会停留在窗口上不会消失,没有完成随鼠标移动的目标。
因此每次绘制圆前需要清空窗口内容,使用cleardevice()函数。
此时运行代码后会发现虽然圆随鼠标移动,但是会不断闪烁并不连续。
此时使用双缓冲窗口解决,添加三行代码:BeginBatchDraw();FlushBatchDraw();EndBatchDraw();具体位置见总体代码。
代码如下:
#include <graphics.h>
int main() {
initgraph(1280, 720);
int x = 300;
int y = 300;
BeginBatchDraw();
while (true)
{
ExMessage msg;
while (peekmessage(&msg))
{
if (msg.message == WM_MOUSEMOVE) {
x = msg.x;
y = msg.y;
}
}
cleardevice();
solidcircle(x, y, 50);
FlushBatchDraw();
}
EndBatchDraw();
}