Существует ли стандартный способ обработки множества различных вариантов событий мыши в Java?

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

  •  12-09-2019
  •  | 
  •  

Вопрос

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

Есть ли лучший или стандартный способ справиться с чем-то подобным?Я быстро загуглил, но, как я уже говорил, люди в Stack Overflow всегда дают лучший, более актуальный и актуальный ответ.

Я считаю, что я все еще новичок в Java.

Заранее спасибо.

Это было полезно?

Решение

Вы можете попробовать найти что-то похожее на паттерн стратегии.

По сути, вы начинаете с нажатия кнопки комнаты на панели инструментов.Панель инструментов проходит и сообщает сетке использовать прослушиватель действий «место в комнате».Предположительно удаление любого предыдущего прослушивателя действий, который слушал

Прослушиватель действий в месте комнаты, в свою очередь, будет реализовывать всю интересную логику для щелчка левой/правой кнопкой мыши, перетаскивания и т. д.

Если у вас есть несколько этапов строительства комнаты (скажем, установка дверей, затем окон, затем люков);слушатели действий будут нести ответственность за передачу управления следующему этапу:что-то вроде конечного автомата.

Итак, начните с нажатия кнопки «комната», будет добавлен прослушиватель «разместить комнату».Перетащите область, в которой вы хотите, чтобы комната была, «разместить комнату» изменяет состояние игры, затем меняет прослушиватель действий на прослушиватель «разместить окна».До бесконечности...пока не закончишь.

Один очень простой (некомпилируемый) пример:

class GridPanel extends JPanel
{
    void SetMouseListener(MouseListener newListener)
    {
        for(MouseListener ml : getMouseListeners())
            removeMouseListener(ml);
        addMouseListener(newListener);
    }
}

class ControlPanel extends JPanel
{
    GridPanel gameGrid;

    void OnRectangleButtonClicked(some stuff)
    {
        gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid));
    }
}

class PlaceRoomListener extends MouseAdapter
{
    GridPanel gameGrid;

    //constructor, etc

    void OnClick(mouse event)
    {
        gameGrid.doCoolStuff();
        gameGrid.SetMouseListener(new PlaceTrapDoorListener());
    }
}

//etc

Теперь, если оставить в стороне этот некомпилируемый пример, Pyrolistical имеет смысл:Обычно вы не хотите объединять игровую модель и графический интерфейс в один набор классов.Вы хотите, чтобы модель была отделена от графического пользовательского интерфейса и управлялась ею через четко определенный интерфейс.

(Кроме того, вероятно, есть более эффективные методы удаления прослушивателя мыши, чем просто случайное удаление всех прослушивателей...Я немного спешил, извините)

Другие советы

Похоже, вам нужно определить свою игровую модель/состояние и держать ее отдельно от действий мыши.

Вы используете MVC?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top