Як я повинен мати введення ключа / миші в розширеній грі Java?


9

Я програміст-самоучок, тому не знаю правильних способів робити справи. Я створив такі прості ігри, як астероїди та змія, але в цих іграх ви можете легко змінювати змінні в межах функцій keyevent. Ось як я це зробив у своїй простій грі Asteroids:

/*
* key listener events
*/
public void keyReleased(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = false;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = false;
            break;

        case KeyEvent.VK_UP:
            accel = false;
            break;

        case KeyEvent.VK_1:
            cls = true;
            break;
        case KeyEvent.VK_ENTER:
            break;
        case KeyEvent.VK_SPACE:
            fire = false;
    }
}
public void keyTyped(KeyEvent K){}
public void keyPressed(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = true;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = true;
            break;

        case KeyEvent.VK_UP:
            accel = true;
            break;

        case KeyEvent.VK_1:
            cls = false;
            break;
        case KeyEvent.VK_ENTER:
            clearAllBullets();
            break;
        case KeyEvent.VK_SPACE:
            fire = true;
    }
}

Якщо я мав би зробити більш досконалу гру (з головним меню, опціями, основною грою тощо), як мені зробити введення клавіші / миші?

Крім того, якщо я мав би перейти до одиночного гравця, чи повинен я поставити весь код гри в один клас? Чи є спосіб перенести код одного гравця в окремий клас і якимось чином введення ключа все ще змінити змінні та таке?


+1 Ваша відповідь дозволила мені дізнатися щось нове з відповіді bearcdp. Спасибі за запитання! =)
Буде Маркуйлер

Відповіді:


3

Я не експерт, і все-таки пропоную розділити як управління, так і логіку бізнесу / гри / меню (назвіть його).

Я вже відповів на подібне запитання щодо вказівки Змії в грі, розробленій з класами. Ява є об'єктно-орієнтованою мовою, я думаю, ви вмієте написати адекватні класи та інше. Потім, коли ви написали свій об’єктний клас, якщо це так, що ваш об'єкт повинен реагувати на деякі клавіші та клацання миші, я б перейшов до класу Controller, який знає, що зараз відображається на екрані, а потім скажіть цьому об’єкту, що він повинен зробіть залежно від натиснутої клавіші або натиснутої області.

Ось посилання на питання, яке я вам сказав, на яке я відповів про відокремлення елементів керування від логіки об'єкта. Він також включає зразок коду, який ілюструє мою думку.

Переміщення мого спрайту в XNA за допомогою класів

( На жаль, жодна відповідь ще не була прийнята в ОП, тому ми не знаємо напевно, чи вирішив він його занепокоєння. Крім того, я завжди розробляю цей шлях і не знаходжу проблем, роблячи це до цих пір. )

Тепер я знаю, вона позначена XNA. Ідея чи дизайн - це більш високий рівень архітектури, ніж використовувана технологія, тому такий дизайн можна було просто адаптувати до синтаксису Java. Загальна ідея залишається такою ж. =)

Я сподіваюся, що це допомагає! Я буду радий допомогти далі, коли зможу, просто запитайте! =)


5

Відповідь Вілла показує, що, мабуть, є найбільш гнучким та простим, і я рекомендую це, якщо вам потрібно прямо вперед опитування.

Але, якщо вам потрібен простий спосіб перевірити наявність різних комбінацій натискань кнопок, уникаючи при цьому великої кількості комутаторів, і якщо заяви, ви можете використовувати переліки бітових прапорців.

Я не знаю, що ви знаєте про бітові вектори, тому ось огляд: В основному у вас є клас перерахунку, який представляє всі можливі ключі. Кожен перерахунок повинен мати значення, яке відповідає біту в цілому. (тобто: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014 тощо). ( Посилання для цього на Java).

Тепер, оскільки ви можете передавати інформацію про до 32 (або 64, якщо ви використовуєте longs) клавіші, ви можете мати хеш-таблицю, яка асоціює бітові вектори (int або long) з об'єктами, що потрапляють у якийсь інтерфейс KeyComboCallback, який просто містить виклик одного методу, Do (), який викликається при натисканні асоційованої комбінації клавіш.

Тепер, коли ви створюєте / ініціалізуєте об’єкт програвача або об'єкт меню, ви можете здійснити виклик до якогось диспетчера вводу та передати йому всі потрібні бітові комбінації клавіш, а також пов’язати їх з анонімними внутрішніми класами.

// ... in your init code for Player

InputManager.map(
    KeyMap.A.val() | KeyMap.B.val() | KeyMap.C.val(), 
    new KeyComboCallback(KeyMap keys) {
        public void Do() {
           this.DoCrazyAwesomeComboAttack();
        }
    });

// ...  continue init

Це дійсно швидко та зручно для C ++ та C #, але переліки Java особливі, тому вам може бути зручніше створити клас KeyCombination або щось таке, що зберігатиме всю цю інформацію, не турбуючись про перерахунки. Але ідея все одно та сама. Я використовую це в грі XNA, і мені дуже подобається споруда. Ви також можете використовувати його для розділення областей введення, що корисно для порівняння різних частин клавіатури або геймпада незалежно (може бути корисно для двох гравців на одній клавіатурі).


Мені подобається ваша публікація, особливо "this.DoCrazyAwesomeComboAttack ();" XD. Здається, ваш шлях є кращим способом для складних речей, тому я збираюся дотримуватися більш легких речей. Дякую за твою допомогу!
Стівен Роджерс

+1 Дуже цікава відповідь! Я довідався з цієї відповіді і буду уважно її перевіряти, коли в мене буде більше часу, щоб витратити на розвиток хобі ігор. І дякую за те, що ви сказали, що моя відповідь хороша, хоча це для більш простих речей, про які я б не заперечував, оскільки я початківець у GD. =) Дякую!
Буде Маркуйлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.