我在实现双人小游戏的时候发现自己写的代码运行时如果玩家1长按控制方向的按键时,玩家2按下自己控制方向的按键,就会中断玩家1的移动。于是我在网上找解决方法,就看到了村长给一个跟我有一样问题的网友的回答,我按照村长的回答写了下面这段代码,虽然这样可以在按下一个键的时候处理另一个按键的消息,但是不能实现长按移动,所以想问一下有没有更好的解决方法。
//编译环境:VS2022,EasyX_20220901
#include <stdio.h>
#include <easyx.h>
struct Ball
{
int x;
int y;
int r;
};
int main()
{
initgraph(800, 600);
//创建并初始化两个小球
struct Ball ball1 = { 300, 300, 30 };
struct Ball ball2 = { 500, 300, 30 };
BeginBatchDraw();
while (1)
{
cleardevice();
//绘制小球
setfillcolor(WHITE);
solidcircle(ball1.x, ball1.y, ball1.r);
solidcircle(ball2.x, ball2.y, ball2.r);
//小球移动
ExMessage m;
if (peekmessage(&m, EX_KEY))
{
if (m.message == WM_KEYDOWN && m.prevdown == false)
{
switch (m.vkcode)
{
case 'A':
ball1.x -= 10;
break;
case 'D':
ball1.x += 10;
break;
case 'W':
ball1.y -= 10;
break;
case 'S':
ball1.y += 10;
break;
case VK_LEFT:
ball2.x -= 10;
break;
case VK_RIGHT:
ball2.x += 10;
break;
case VK_UP:
ball2.y -= 10;
break;
case VK_DOWN:
ball2.y += 10;
break;
}
}
else if (m.message == WM_KEYUP && m.prevdown == true)
{
switch (m.vkcode)
{
case 'A':
ball1.x -= 10;
break;
case 'D':
ball1.x += 10;
break;
case 'W':
ball1.y -= 10;
break;
case 'S':
ball1.y += 10;
break;
case VK_LEFT:
ball2.x -= 10;
break;
case VK_RIGHT:
ball2.x += 10;
break;
case VK_UP:
ball2.y -= 10;
break;
case VK_DOWN:
ball2.y += 10;
break;
}
}
}
Sleep(25);
FlushBatchDraw();
}
EndBatchDraw();
getchar();
closegraph();
return 0;
}