-4

我正在使用 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);

        }
    }
4

2 回答 2

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);
            }
        }
    }
}
于 2012-11-27T18:54:35.853 回答
0

在旧式控制台中,逻辑通常与垂直同步同步(一种方法是在游戏循环中插入对 waitForVsync() 的调用)。因此,例如:您将在每个 vsync (~60 Hz) 运行一次循环体,这意味着您将每帧移动 1 步,或每秒移动 60 步。适当调整运动。

于 2012-11-27T20:16:03.393 回答