Как лучше всего отделить объекты, например, в игре «змея» - PullRequest
1 голос
/ 23 октября 2011

Я создаю игру-змею в C # / XNA для удовольствия, но это хорошая возможность попрактиковаться в хорошем дизайне объектов.

Змеиный объект

Есть объект-змея, который по сути является связанным списком, каждый узел является вектором с координатами X & Y, которые относятся к карте.

Также есть несколько свойств, таких как только что съел змея (в этом случае последний узел тела не удаляется для этого обновления), направление, в котором движется змея и т. Д.

Объект карты

Карта (игровая область) хранит свое содержимое внутри двумерного массива целых чисел - использование массива примитивов для хранения карты должно снизить потребление памяти и быстрее (и проще) выполнять итерации по сравнению с массивом векторов.

Содержимое определяется внутри перечисления {Пусто, Стена, Змея, Еда}, которое затем сохраняется внутри массива в соответствующих координатах.

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

Вопрос !!

У меня вопрос ... это слишком тесная связь, и в этом случае есть какие-либо предложения (например, схема наблюдателя), или это нормально для этой ситуации ...

Я пытался придумать, как отделить змею от необходимости знать систему координат, используемую картой, но не могу придумать, как заставить ее работать и сохранять позиции каждого узла относительно. друг другу.

Любые ответы приветствуются, ура!

Ответы [ 3 ]

0 голосов
/ 24 октября 2011

"Эта муфта слишком тугая?" Нет, это не так.

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

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

0 голосов
/ 25 октября 2011

Вот простая структура первой мысли:

 create an interface called MapContainable
 //marker interface
 interface MapContainable {
 }

 interface MapMovable extends MapContainable {
   ///map movement specific contract methods here
 }

class Snake implements MapMovable {
.....
}

Таким образом, вашей карте не нужно знать, существуют ли конкретные объекты, называемые змеями, продуктами питания и т. Д. Вы, змеиные объекты, не должны знать о существовании карты.Змея просто движется!

0 голосов
/ 24 октября 2011

Я думаю, вы уже намекали на ответ сами. Нынешний план создания Змеи, на который есть ссылка на карте, тесно связан между собой.

Возможно, вы захотите создать другой интерфейс, такой как MapListener, который будет реализован Snake. Snake будет прослушивать событие, которое карты будут публиковать, и реагировать на него, фактически делая Snake подписчиком на событие, которое публикует Map (например, рендеринг в правильной позиции, как вы говорите). Вы даже можете иметь ArrayList of Listeners, чтобы иметь возможность добавлять на карту новый объект, который будет реагировать на событие на картах, когда ваша игра становится все более сложной.

Справочную информацию о создании прослушивателя см. В этом вопросе SO Как я могу написать собственный прослушиватель . Пока этот пример ожидает завершения загрузки, вы должны увидеть шаблон в принятом ответе для создания пользовательского прослушивателя для вашей игры. Дайте мне знать, если вам понадобятся какие-либо разъяснения, и я адаптирую код под ваш случай.

...