现在我正在制作一个游戏,屏幕两侧有两块板(即左和右)。还有一个在屏幕上反弹的球。当它接触任何一个板时,它会反弹回来。但是如果它触及屏幕的左边缘或右边缘,那么它的游戏结束了。我们必须通过箭头键或标准(W,A,S,D)键控制印版。现在我的问题是当我按下W或任何移动键时它会移动一次然后停止。
我必须多次按它才能移动它。当我按住任何一个移动键时,我想要连续移动。我在Windows 7 PC上使用带有Dev c ++的allegro 5。
您需要跟踪密钥的状态。当您收到按键事件时,将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收到键事件与您之间的时间差异,因此无法保证其准确性。
事件处理逻辑应响应按键并更新板的速度,更新逻辑应根据速度移动板。这是一些伪代码:
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