连续键盘动作

时间:2016-11-13 08:43:56

标签: c++ allegro5

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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收到按键事件与您执行按键事件之间的时间差,因此不能保证其准确性。

答案 2 :(得分:-1)

在伪代码中,如果事件按键(Allegro_event_key down)应该检测到按键按下并且在适当的键中将在 allegro_event_key_up 中执行其逻辑,则您应该停止逻辑执行操作。

例如,如果按下键做某事,当按下键时停止做某事。

希望有帮助。问候并感谢您。