EasyX开发——绘制跟随鼠标移动的小球
游戏主循环:
#include<graphics.h>int main()
{initgraph(1280, 720);while (true){}return 0;
}
peekmessage函数:如果成功拉取到了消息,函数就会返回true,反之就会返回false
使用另外一个循环来不断地从消息队列当中拉取已有的消息,并进行处理,直到消息队列当中没有消息为止
添加事件处理函数
#include<graphics.h>int main()
{initgraph(1280, 720);while (true){ExMessage msg;while (peekmessage(&msg)){//在这里进行消息处理}}return 0;
}
在msg变量当中保存有鼠标的x和y坐标
每次鼠标移动,我们就立刻绘制出圆的图案
怎么知道鼠标是否移动了?
添加判断:if(msg.message==WM_MOUSEMOVE)
圆怎么绘制?
使用solidcircle函数来绘图:
#include<graphics.h>int main()
{initgraph(1280, 720);int x = 300;int y = 300;while (true){ExMessage msg;while (peekmessage(&msg)){//在这里进行消息处理if (msg.message == WM_MOUSEMOVE){x = msg.x;y = msg.y;} }solidcircle(x, y, 100);}return 0;
}
但是在绘制新的位置的圆的时候,没有对之前位置的圆进行擦除
简单起见我们在每次绘图之前都使用cleardevice函数来清空整个窗口
即:
cleardevice();
solidcircle(x, y, 100);
运行之后,发现绘制出来的圆一直在闪烁
这是因为我们没有使用双缓冲对绘图进行优化处理
解决方案:
在主循环前后分别添加BeginBatchDraw()和EndBatchDraw()
在绘图之后添加FlushBatchDraw()函数
完整代码:
#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, 100);FlushBatchDraw();}EndBatchDraw();return 0;
}
okok,今天的你就到此为止吧,明天还要接着🐺啊!!🎈🎈🧡