我试图让我的球运动只是像运动一样流动。如何按下向上键,向下键,向左键或向右键,它不会向上移动一个单位,停止,然后继续移动。另外,如何在放开钥匙的同时停止另一个方向的同时向两个方向移动? 感谢
if(GetAsyncKeyState(VK_UP))
{
if(g_nGameState == SETTINGUPSHOT_GAMESTATE || g_nGameState == INITIAL_GAMESTATE)
{
g_cObjectWorld.AdjustCueBallY(MOVEDELTA);
g_cObjectWorld.ResetImpulseVector();
}
}
if(GetAsyncKeyState(VK_DOWN))
{
if(g_nGameState == SETTINGUPSHOT_GAMESTATE || g_nGameState == INITIAL_GAMESTATE)
{
g_cObjectWorld.AdjustCueBallY(-MOVEDELTA);
g_cObjectWorld.ResetImpulseVector();
}
}
if(GetAsyncKeyState(VK_LEFT))
{
if(g_nGameState == SETTINGUPSHOT_GAMESTATE || g_nGameState == INITIAL_GAMESTATE)
{
g_cObjectWorld.AdjustCueBallX(-MOVEDELTA);
g_cObjectWorld.ResetImpulseVector();
}
}
if(GetAsyncKeyState(VK_RIGHT))
{
if(g_nGameState == SETTINGUPSHOT_GAMESTATE || g_nGameState == INITIAL_GAMESTATE)
{
g_cObjectWorld.AdjustCueBallX(MOVEDELTA);
g_cObjectWorld.ResetImpulseVector();
}
}
答案 0 :(得分:1)
您可以这样做:
使用SetTimer在窗口事件循环上创建一个计时器10ms间隔应该对你想要的东西有好处。它必须在窗口线程上的原因是GetAsyncKeyState在从不同的线程调用时不会给你想要的结果。 我们使用一个计时器,因为对GetAsyncKeyState的调用应该是一个不同的消息,然后是关键处理事件,所以密钥仍然在队列中。
在计时器功能中你可以做这样的事情
int deltaX = 0, deltaY = 0;
unsigned int downDown = GetAsyncKeyState(VK_DOWN);
unsigned int upDown = GetAsyncKeyState(VK_UP);
unsigned int leftDown = GetAsyncKeyState(VK_LEFT);
unsigned int rightDown = GetAsyncKeyState(VK_RIGHT);
if(downDown & 0x00008000)deltaY -= MOVEDELTA;
if(upDown & 0x00008000)deltaY += MOVEDELTA;
if(leftDown & 0x00008000)deltaX -= MOVEDELTA;
if(rightDown & 0x00008000)deltaX += MOVEDELTA;
g_cObjectWorld.AdjustCueBallX(deltaX);
g_cObjectWorld.AdjustCueBallY(deltaY);
g_cObjectWorld.ResetImpulseVector();
通过这种方式,您还可以确保移动在键盘上停止(deltaX == 0&& deltaY == 0) 我不确定AdjustCueBall(X | Y)的语义是什么,但如果你确定当它们变为0时它们会停止向那个方向移动它应该可以正常工作。
另外你应该注意到你的键盘必须支持硬件中的多次按键才能使用两个键对角移动 - 如果它确实如果上面的解决方案没有,你仍然可以使用向四个基本方向中的任何一个方向移动。
答案 1 :(得分:0)
一种设计是仅将键盘用于更改方向。
让球在当前方向继续,直到收到一个可以改变方向的按键。这减少了处理器上的负载不断被按键中断。
对于沿非正交方向行进,请使用更多按键。看一下“键盘”。有些键是'5'键的对角线。使用那些。