Как я должен иметь ввод ключа / мыши в продвинутой Java-игре?

9

Я программист-самоучка, поэтому я не знаю, как правильно делать вещи. Я сделал простые игры, такие как астероиды и змеи, но в этих играх вы можете легко изменять переменные в функциях keyevent. Вот как я это сделал в своей простой игре «Астероиды»:

/*
* 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

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

Я уже ответил на аналогичный вопрос о том, как давать указания Снейку в игре, разработанной с использованием классов. Java - объектно-ориентированный язык, я думаю, что вы умеете писать адекватные классы и прочее. Затем, когда вы написали свой объектный класс, если это так, что ваш объект должен реагировать на некоторые клавиши и щелчки мыши, я бы выбрал класс Controller, который знает, что в данный момент отображается на экране, а затем скажу этому объекту, что он должен делать. делать в зависимости от нажатой клавиши или области, по которой щелкнули.

Вот ссылка на вопрос, который я вам сказал, на который я ответил об отделении элементов управления от логики объекта. Это также включает пример кода, который иллюстрирует мою мысль.

Перемещение моего спрайта в XNA с использованием классов

( К сожалению, ни один из ответов еще не был принят ОП, поэтому мы не знаем наверняка, решил ли он его проблемы. Кроме того, я всегда проектировал этот путь и не нашел никаких проблем, делая это до сих пор. )

Теперь я знаю, это помечено XNA. Идея или дизайн - более высокий уровень архитектуры, чем используемая технология, поэтому этот дизайн может быть просто адаптирован к синтаксису Java. Общая идея остается прежней. знак равно

Надеюсь, это поможет! Я буду рад помочь, когда смогу, просто спросите! знак равно

Уилл Маркуиллер
источник
5

Ответ Уилла покажет вам, что, вероятно, является наиболее гибким и понятным, и я бы порекомендовал его, если вам нужен прямой входной опрос.

Но, если вам нужен простой способ проверить различные комбинации нажатий кнопок, избегая при этом большого количества переключений и операторов if, вы можете использовать перечисления битовых флагов.

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

Теперь, поскольку вы можете передавать информацию о 32 (или 64, если вы используете long) ключах, вы можете иметь хеш-таблицу, которая связывает битовые векторы (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, и мне очень нравится объект. Вы также можете использовать его для разделения областей ввода, что полезно для независимого сравнения различных частей клавиатуры или геймпада (может быть полезно для двух игроков на одной клавиатуре).

michael.bartnett
источник
Мне нравится ваш пост, особенно "this.DoCrazyAwesomeComboAttack ();" XD. Ваш путь кажется лучшим путем для сложных вещей, поэтому я собираюсь придерживаться более простых вещей. Спасибо за помощь!
Стивен Роджерс
+1 Очень интересный ответ! Я извлек урок из этого ответа и внимательно его рассмотрю, когда у меня будет больше времени на разработку хобби-игр. И спасибо, что сказал, что мой ответ хорош, хотя и для простых вещей, о которых я бы не стал спорить, так как я новичок в GD. =) Спасибо!
Уилл Маркуиллер