|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
реализация специфического поведения
Друзья!
Я рискну ещё раз описать словами ситуацию в надежде получить дельный совет, хотя уже и сам понимаю, насколько это неблагодарное занятие - давать советы, не зная деталей проекта. И тем не менее. Есть такая механика в одной игре (забыл название), когда герой может на время стать зомби. И в этом состоянии он лечится ядом и, наоборот, дамажится исцеляющими зельями и магией. Нужно реализовать нечто подобное, то есть изменять принимаемые эффекты при наличии некоторых статусов. У меня сделан и работает вариант, когда текущие статус-эффекты модифицируют свойства самого персонажа - в геттере прописан запуск метода, перебирающего все действующие статус-эффекты и собирающего в кучу модификаторы соответствующего свойства. А вот как в обратную сторону сделать? Наследование и переопределение сеттера не подходит, т.к. подобное поведение является временным. Понятно, что если подобные эффекты единичны, то можно и if вкатать да проверить, но как-то это не по-православному.
__________________
Не сломано - не чини! |
|
|||||
Ну, если у нас уже есть экземпляр, то чтобы временно изменить свойства персонажа, можно оборачивать его в Декоратор.. Будет какой-нибудь var zombie = ZombieDecorator(character). И подменять им персонажа. Декоратор будет модифицировать воздействия нужным образом.
Либо, если хочется скрыть все это внутри персонажа, то можно и внутрь него внедрить декоратор. При этом публичные методы не будут знать, с кем именно они работают - они будут работать просто с интерфейсом iChar каким-нибудь. Просто в какой-то момент ты будешь подменять чара декоратором Добавлено через 2 часа 26 минут а еще можно через по умолчанию пустой Адаптер все влияния, такие, как дамаг и прочее.. И при разных воздействии просто втыкать нужный адаптер в метод setAdapter - ZombieAdapter, IceAdapter, VampierAdapter, StoneAdapter и т.п. ..
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
ZergMaster, спасибо.
__________________
Не сломано - не чини! |
|
|||||
Декоратор - нужен для динамического добавления функциональности объекту к его основной.
Адаптер - приводит один интерфейс к другому. @ZergMaster как у вас структурные шаблоны стали поведенчискими, для меня остается загадкой. UPD ну и тут ситуация в двух словах: "объект поменял свое состояние из-за чего поменялось его поведение"
__________________
местонахождение |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Цитата:
Вопрос вдогонку. Как уважаемая аудитория относится к назначению свойств-маркеров, влияющих на поведение объекта?
__________________
Не сломано - не чини! |
|
|||||
Цитата:
__________________
местонахождение |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Ну вот так:
То есть когда в классе заводятся свойства, значение которых определяют поведение. В общем то, что ты предложил, но в таком топорном варианте
__________________
Не сломано - не чини! |
|
|||||
СлаваRa
прикольно. Примерно это я и имел ввиду, когда говорил про декоратор внутри чара, и чтобы был метод changeDecorator, который подменивает методы. Адаптер подходит в том смылсе, что мы как раз соединяем два интерфеса - интерфейс зомби накладываем на интерфейс чара. Но да, паттерн State тут подходит идеально, это именно он и есть, просто я его не знал/забыл, вот и вывалил велосипед. )
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Главное ограничение шаблона "Состояние" - это организация состояний как взаимоисключающих элементов, в соответствии с теорией конечных автоматов. Теперь нужно покумекать над реализацией пребывания объекта одновременно в нескольких состояниях
__________________
Не сломано - не чини! |
|
|||||
Вот представь, что есть физически здоровые люди, с расстройством психи. Его физическое состояние в норме, его психологическое состояние нет, но они не исключающие друг друга, как например живое не может быть мертвым и наоборот, все всегда зависит от постановки(формулировки) задачи.
__________________
местонахождение |
Часовой пояс GMT +4, время: 15:29. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|