【问题标题】:Continuous keyboard movements连续的键盘动作
【发布时间】:2016-11-13 08:43:56
【问题描述】:

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

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

【问题讨论】:

  • 做一个切换,当检测到 keydown 事件时启用移动,当检测到 keyup 事件时禁用移动。

标签: c++ allegro5


【解决方案1】:

您需要跟踪键的状态。当你得到一个按键事件时,将 keydown 设置为 true。当你得到一个 key up 事件时,将 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】:

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

    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
    

    【讨论】:

    • 这正是我所做的@rcorre 但是当我按下向上箭头键时它会移动一次,当我释放它时,它会向后移动并返回之前覆盖的距离。
    【解决方案3】:

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

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

    我希望这会有所帮助。问候和谢谢。

    【讨论】:

      猜你喜欢
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      相关资源
      最近更新 更多