2012-11-27 29 views
-3

我使用C编写了一个Game Boy游戏。我实现了一个可以上下移动的游标,具体取决于按下哪个按钮。如果按下UP键,则相应的位被设置在寄存器中。然后我让光标向上移动。游戏处于无限循环中。因此在下一次迭代中,仍然将寄存器视为已设置。我需要一些簿记来告诉我自己将来光标已经移动了,我应该忽略该位已设置的事实。我该怎么做呢?将按钮的寄存器标记为已读

编辑:这是我写的代码。基本上,当我按下向上按钮时,光标上升很多步骤。我希望它只需要一步。

if (KEY_DOWN_NOW(BUTTON_UP)){ 
     if (row - 1 >= 0){ 
      undrawCursor(row, column); 
      row--; 
      drawCursor(row, column); 

     } 
    } 
    else if (KEY_DOWN_NOW(BUTTON_DOWN)){ 
     if (row + 1 <= 160){ 
      undrawCursor(row, column); 
      row++; 
      drawCursor(row, column); 

     } 
    } 
+0

你是否正在处理某人按住UP按钮两次迭代,或者在他们发布并且已经读取之后该位未被清除?这是两个不同的问题。 –

+0

第一个。等等,它们释放后立即清除它?我遇到的问题是它向上移动了多个步骤。 – user1210233

+0

谁可以解释downvote?我想了解这里遵循的规范。 – user1210233

回答

1

你正在阅读的可能只是告诉你的按钮的状态寄存器,当你读它不明确。如果它像那样工作,那么你将无法实现像“自动启动”这样的功能,因为你不知道该按钮是否仍然被按下,或者它是否被释放。

您需要为每个按钮保留一个变量来跟踪它的状态,并且只对状态进行更改。例如,这里是你如何做到这一点的一个按钮:

up_pressed = FALSE; 

for (;;) 
{ 
    if (up_pressed) 
    { 
     if (!KEY_DOWN_NOW(BUTTON_UP))  // up button has been released 
     { 
      up_pressed = FALSE; 
     } 
    } 
    else 
    { 
     if (KEY_DOWN_NOW(BUTTON_UP))  // up button has been pressed 
     { 
      up_pressed = TRUE; 
      if (row > 0) 
      { 
       undrawCursor(row, column); 
       row--; 
       drawCursor(row, column); 
      } 
     } 
    } 
} 
0

在以前的游戏机,逻辑通常是同步的垂直同步(这样做会插入一个呼叫的一种方式waitForVsync()在你的游戏循环中)。因此,例如:您可以按vsync(〜60 Hz)运行一次循环体,这意味着您可以每帧移动一步,或每秒移动60步。适当调整运动。