1

我试图让我的球运动像流体一样运动。我怎么能得到当我按上键、下键、左键或右键时,它不向上移动一个单位,停止,然后继续移动。另外,我怎样才能让它同时向两个方向移动,而在松开钥匙时不停止另一个方向?谢谢

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();
    }
}
4

2 回答 2

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();

通过这种方式,您还可以确保在 keyup 时停止移动 (deltaX == 0 && deltaY == 0) 我不确定 AdjustCueBall(X|Y) 的语义是什么,但如果你确保它们停止移动当他们得到 0 时,这个方向应该可以正常工作。

此外,您应该注意到,您的键盘必须支持硬件中的多个按键,以便您能够使用两个键沿对角线移动 - 如果可以,上述解决方案将有效,如果不支持,您仍然可以在其中任何一个中移动四个基本方向。

于 2012-09-30T23:22:56.997 回答
0

一种设计是仅将键盘用于改变方向。

让球继续沿其当前方向前进,直到收到会改变其方向的按键。这减少了处理器上的负载,不会被按键连续中断。

至于非正交方向,使用更多键。看一个“键盘”。一些键是“5”键的对角线。使用那些。

于 2012-09-27T23:31:02.997 回答