Определение поведения игровых объектов в XML - PullRequest
0 голосов
/ 08 января 2010

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 января 2010

Мне кажется, я понимаю ваш подход.

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

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

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

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

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

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

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

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

0 голосов
/ 08 января 2010

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

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

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

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

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