ОО вопрос дизайна игры - PullRequest
6 голосов
/ 18 июля 2009

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

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

Если Model и каждый Entity внутри содержат ссылку на GamePanel или просто кэшируют последнюю известную позицию мыши и регулярно получают обновления от GamePanel. В первом варианте при создании модели необходимо указать ссылку на GamePanel, а во втором - в качестве параметра метода World.update() будет отправлена ​​последняя позиция мыши.

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

Спасибо, Бен.

Ответы [ 5 ]

3 голосов
/ 18 июля 2009

Распространенным решением является запуск событий. В этом случае GamePanel запустит событие, информирующее все заинтересованные (подписанные на событие) объекты (Entity) в Model новой позиции мыши.

Таким образом, GamePanel не нужно явно знать, какие сущности сообщать, а сущностям не нужно хранить экземпляр GamePanel.

Мой совет: читайте о слушателях событий. (Java.util)

3 голосов
/ 18 июля 2009

По моему мнению, это будет зависеть от того, как ваши классы взаимодействуют. Вызывает ли изменение положения мыши объекты в классе Model? или Класс Model не зависит от GamePanel и работает только с текущими значениями положения мыши?

Если позже и в этом случае я согласен с тем, что Джефф сказал до меня. Передавайте дескриптор GamePanel классу Model при его создании и позволяйте каждому объекту использовать дескриптор для доступа к положению мыши, когда это необходимо. Таким образом, всегда используется обновленная позиция мыши.

Если первый вариант, я бы предложил использовать Observers, чтобы сообщить классу Model, когда значение положения мыши изменилось. Тогда класс Model мог бы использовать тот же дизайн (т.е. пусть класс Model всегда имеет дескриптор класса GamePanel) и получать доступ к текущим значениям в GamePanel.

Подводя итог моему ответу на ваш вопрос, я думаю, что логично и в соответствии с концепциями ОО позволять GamePanel хранить значения положения мыши и предоставлять другим классам доступ к этой информации с помощью экземпляра GamePanel.

Спасибо, Рохан.

2 голосов
/ 18 июля 2009

Вы можете всегда иметь текущие координаты как открытое свойство GamePanel, чтобы сущности / модели могли просто получить к ним доступ оттуда.

1 голос
/ 18 июля 2009

Всегда ли модель должна знать, где находится мышь. IE: вам нужна позиция мыши при каждом обновлении или только в определенных точках.

Если вам это нужно в любой момент или во время каждого обновления, то либо решение, которое вы задокументировали, либо любое решение здесь должно быть надежным.

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

Удачи! Надеюсь, это поможет.

1 голос
/ 18 июля 2009

Если вы хотите опрашивать текущую позицию мыши, вы можете запустить этот фрагмент кода в потоке отправки событий в любое время:

Point pt = MouseInfo.getPointerInfo().getLocation();
Point cpt = GamePanel.getLocationOnScreen();
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y);

И rel содержит относительное положение мыши.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...