لماذا لا keysDownRepeat () في libnds يبدو للعمل عند استدعاء عدة مرات؟

StackOverflow https://stackoverflow.com/questions/313253

  •  10-07-2019
  •  | 
  •  

سؤال

ولدي كود مثل هذا التحرك لاعب في المباراة يساري واليمين، صعودا، ونزولا:

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() يعمل (دون معدل تكرار، وبطبيعة الحال). و الوثائق ليس المساعدة هنا.

هل كانت مفيدة؟

المحلول

وكان علي أن أجد رمز libnds مصدر لهذا الرقم. نظرة على تنفيذ keysDownRepeat ():

uint32 keysDownRepeat(void) {
    uint32 tmp = keysrepeat;

    keysrepeat = 0;

    return tmp;
}

وانها في الواقع إرجاع مفاتيح ثم يعيد لهم العودة إلى 0. هذا لم يتم توثيقها. I حل هذه عن طريق تخزين نتيجة 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();
}

نصائح أخرى

ملحوظة أيضا أن لديك keysHeld () لتحديد المفاتيح التي "لا تزال باستمرار" من الإطار السابق، في حين keysDown () عادة مصممة لمساعدتك على تحديد "المفاتيح التي للتو بيينغ ضغط هذا الإطار" (أي بين مكالمتين من scanKeys ()). keysDownRepeat () غير مفيد الواضح للشعب الذي يريد سلوك لوحة المفاتيح مثل التمرير من خلال قوائم مع DPAD: سترى مرارا وتكرارا على مفتاح "لتسقط مرة أخرى" كل إطار X. وباعتراف الجميع، على الرغم من تعريف الدلالي من keysDownRepeat () سيئة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top