Каким образом лучше всего реализовать пассивные навыки, и их влияние на персонажа?
Пока у меня приблизительно следующий формат - каждый навык реализован внешним классом, и в каждом есть определенное событие, реагирующее на изменение "переключателя". Соответственно, каждое действие героя или врага меняет "переключатель". В самом событии прописано непосредственно действие навыка.
Как на таком принципе работает, например, уворот.
  • происходит какое-либо действие, навык читает здоровье персонажа и записывает его;
  • враг наносит персонажу удар, таким образом, снова активируя действие навыка;
  • навык сравнивает текущее здоровье персонажа и сравнивает с записанным. Если записанное выше, то с определенным шансом текущему здоровью присваивается значение записанного. Если уворот не прошел, то значение здоровья в навыке просто перезаписывается.
Конечно, не все механики реализуемые таким методом.
Думал насчет модификации этого метода, только вместо "переключателя" делать делегаты, например, "начало хода", "конец хода", "атака", "получение урона", и просто при получении навыка заносить определенные методы класса навыка в определенный делегат, а сами делегаты выполнять в соответственные моменты.
Была еще мысль внести весь возможный функционал в класс персонажа, и сделать его зависимым от чисел, которые уже будут меняться навыками, но это сделает класс персонажа слишком большим, что не очень удобно.

Принятый ответ

Перешел на делегаты, посмотрим, как будет работать.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
26
9 лет назад
0
Перешел на делегаты, посмотрим, как будет работать.
Принятый ответ
0
9
9 лет назад
Отредактирован AsagiriGen
0
Перешел на делегаты, посмотрим, как будет работать.
Прочекай паттерн "Наблюдатель" на делегатах - будет прекрасно работать.
0
23
9 лет назад
0
А как у тебя выглядят активные абилки?
0
26
9 лет назад
Отредактирован lentinant
0
SomeFire, пока никак. Думаю, Каждый активный навык будет рисовать кнопочку на интерфейсе, и уже на самой кнопочке будет определенное действие. Если абилка ненаправленная, то действие будет выполняться сразу, если направленная - вероятней всего, сделаю делегат для непосредственно функционала, и буду выполнять его при непосредственно щелчке мышки. Когда делегат пустой, буду делать непосредственно действие мышки.
GeneralElConsul:
Прочекай паттерн "Наблюдатель" на делегатах
Я сейчас сделаю делегат, отвечающий за скиллы, действующие каждый ход, статическим, и, по сути, это и будет паттерн "Наблюдатель".
0
26
9 лет назад
0
Возник вопрос поверх предыдущего. Как удалить метод с делегата? Обычное вычитание, вроде бы, не работает.
0
29
9 лет назад
0
бтв есть интересная тема, типа как UI ивенты реализуются в некоторых системах, во все листенеры передается объект event, например и в любом листенере можно сделать event.setConsumed(true) и после этого вызов листенеров остановится, это к тому, как делается уворот. Только нужно будет как-то приоритеты листенеров расставлять.
4
29
9 лет назад
4
Doc, ну тут либо очередь с приоритетами, либо обычную очередь использовать для обработки событий, в приницпе ничего сложного.
lentinant, я бы запилил набор интерфейсов событий типа IDamage, IHeal, IDeath и т.д.
В нужной абилке реализовал бы нужные интерфейсы, например для уворота IDamage. А в базовом классе юнита, где происходит расчет нанесенного урона, взял бы список действующих заклинаний и поочередно бы вызывал их обработчики, если они реализуют нужный интерфейс. Просто и гибко!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.