连续键盘动作

问题描述 投票:0回答:2

现在我正在制作一个游戏,屏幕两侧有两块板(即左和右)。还有一个在屏幕上反弹的球。当它接触任何一个板时,它会反弹回来。但是如果它触及屏幕的左边缘或右边缘,那么它的游戏结束了。我们必须通过箭头键或标准(W,A,S,D)键控制印版。现在我的问题是当我按下W或任何移动键时它会移动一次然后停止。

我必须多次按它才能移动它。当我按住任何一个移动键时,我想要连续移动。我在Windows 7 PC上使用带有Dev c ++的allegro 5。

c++ allegro5
2个回答
0
投票

您需要跟踪密钥的状态。当您收到按键事件时,将keydown设置为true。当您获得密钥事件时,将keydown设置为false。

然后在更新功能中,检查键是否已关闭然后移动。

这样的事情很容易:

bool keys[ALLEGRO_KEY_MAX] = {0};

/// In event loop
if (ev.type == ALLEGRO_EVENT_KEY_DOWN) {
   keys[ev.keyboard.keycode] = true;
}
else if (ev.type == ALLEGRO_EVENT_KEY_UP) {
   keys[ev.keyboard.keycode] = false;
}

if (ev.type == ALLEGRO_EVENT_TIMER) {
   if (keys[ALLEGRO_KEY_W]) {
      player.y -= YSPEED;
   }
   if (keys[ALLEGRO_KEY_S]) {
      player.y += YSPEED;
   }
}

您还可以使用al_get_keyboard_state监视键盘状态,但由于allegro收到键事件与您之间的时间差异,因此无法保证其准确性。


0
投票

事件处理逻辑应响应按键并更新板的速度,更新逻辑应根据速度移动板。这是一些伪代码:

while running:
    # event processing
    for event in queue:
        if event is keypress:
            if key is W:
                velocityY -= 10
            if key is S:
                velocityY += 10
        if event is keyrelease:
            if key is W:
                velocityY += 10
            if key is S:
                velocityY -= 10

    # update
    posY += velocityY * elapsedTime
© www.soinside.com 2019 - 2024. All rights reserved.