1

ゲーム内でプレーヤーを上下左右に移動する次のようなコードがあります。

keysSetRepeat(20, 5);

while (lives) {
    scanKeys();

    if (keysDownRepeat() & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN)) {
        u8 new_x = x;
        u8 new_y = y;

        if (keysDownRepeat() & KEY_LEFT) {
            new_x--;
        } else if (keysDownRepeat() & KEY_RIGHT) {
            new_x++;
        } else if (keysDownRepeat() & KEY_DOWN) {
            new_y++;
        } else if (keysDownRepeat() & KEY_UP) {
            new_y--;
        }

        // ...
    }

    // ...

    swiWaitForVBlank();
}

キーが検出されないのはなぜですか? 置き換えるkeysDownRepeat()keysDown()機能します(もちろん、リピート率はありません)。ドキュメントはここでは役に立ちません。

4

2 に答える 2

2

これを理解するには、libnds のソース コードを見つける必要がありました。keysDownRepeat() の実装を見てください。

uint32 keysDownRepeat(void) {
    uint32 tmp = keysrepeat;

    keysrepeat = 0;

    return tmp;
}

実際にはキーを返し、それらを 0 にリセットします。これは文書化されていません。の結果を変数に格納keysDownRepeat()し、変数を使用してキーをチェックすることでこれを解決しました。

keysSetRepeat(20, 5);

while (lives) {
    scanKeys();
    u32 keys_down_repeat = keysDownRepeat();

    if (keys_down_repeat & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN)) {
        u8 new_x = x;
        u8 new_y = y;

        if (keys_down_repeat & KEY_LEFT) {
            new_x--;
        } else if (keys_down_repeat & KEY_RIGHT) {
            new_x++;
        } else if (keys_down_repeat & KEY_DOWN) {
            new_y++;
        } else if (keys_down_repeat & KEY_UP) {
            new_y--;
        }

        // ...
    }

    // ...

    swiWaitForVBlank();
}
于 2008-11-24T01:46:23.053 に答える
1

また、keysHeld()を使用して、前のフレームから「まだ押し続けている」キーを識別できますが、keysDown()は通常、「このフレームを押したばかりのキー」(つまり、2つの間)を識別するのに役立つように設計されています。 scanKeys()の呼び出し)。keysDownRepeat()は、DPADを使用してリストをスクロールするためのキーボードのような動作が必要な場合に明らかに役立ちます。Xフレームごとにキーが「再び下に」表示されます。ただし、確かに、keysDownRepeat()のセマンティクスは十分に定義されていません...

于 2009-12-08T16:12:40.563 に答える