Вопрос

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

Я работаю над игрой.У меня есть GameObjects.У меня есть GameBehaviors.Свойства моих GameObjects определены в XML-файле, который содержит все подробности.

<type name="Object">
    <unit name="follower" behavior="followMouse" >
        ...other unit info here...
    </unit>
</type>

Таким образом, когда создается экземпляр gameObject на основе значения свойства поведения в XML, он как-то к нему привязано поведение.Мне нужно, чтобы поведение имело доступ ко всем свойствам своего родителя, чтобы оно могло перемещать объект, а что нет...

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

Я работаю с AS3, но вы можете сделать его немного более общим.

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

Решение

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

Таким образом, ваш игровой объект может иметь метод initFromXML(xml) или статический фабричный метод, который принимает xml в качестве аргумента.Это анализирует XML и ищет поведение, а затем создает соответствующее поведение.Создание поведения может быть выполнено с помощью другой фабрики.

Затем вы добавляете поведение в список поведений игровых объектов.Все поведения могут быть объектами, происходящими от общего класса, или все они могут реализовывать интерфейс IBehavior.

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

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

Думаю, я понимаю ваш подход.

Это часто встречается в играх, потому что потенциально у вас есть бесконечное количество эффектов, статусов, поведений и т. д.

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

В этом случае вы можете создать функциональные классы, такие как «MouseFollower» или «KeyboardResponder», которые обычно принимают GameObject в качестве аргумента своего конструктора.

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

Вы можете хранить все свои функциональные объекты в массиве внутри GameObject на случай, если вам понадобится их удалить.

Когда они находятся в массиве, вы также можете сделать что-то крутое, например создать интерфейс функционального класса с единообразным набором методов.Так что, если, например, GameObject стал неактивным или отключенным, вы могли бы сказать:

for each IFunctionalObject in GameObject.FunctionalObjects
IFunctionalObject.disable()

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

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