Понедельник, 25 Ноября 2024, 01:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Обработка атрибутов объектов при взаимодействии
SanchesДата: Суббота, 23 Июля 2016, 01:47 | Сообщение # 1
участник
Сейчас нет на сайте
Доброго времени суток читающим.
Есть, например, юниты, у каждого - набор свойств и навыков (а-ля Герои - Минотавр имеет "Храбрость", лазутчик - "Отравленный выстрел")
Возникает, скажем, такая ситуация: лучник стреляет в пехотинца, применяя скилл "Стрельба". Пехотинец имеет навык "Щит", поэтому урон снижен. Однако лучник не простой, он имеет также способность "огненная стрела", поэтому пехотинец загорается. Но будь у пехотинца свойство "Несгораемость", не подгорел бы.
Все юниты, эффекты, навыки - отдельные объекты, с набором методов и, тем более, их реализацией, я не могу определиться.
Как бы вы стали организовывать подобное взаимодействие? Т.е. срабатывание (применение) одного скилла может активировать другой и так далее. Где какой код писать (идейно)?
EgoorДата: Суббота, 23 Июля 2016, 02:20 | Сообщение # 2
участник
Сейчас нет на сайте
Ну по идее при выстреле лучника вызывается функция "Выстрел" у самого лучника с параметром "Цель", а это у нас пехотинец. Там просчитываются все дебаффы у лучника и считается итоговый урон, который должна нанести способность "Выстрел". Далее итоговый урон передается в определенную функцию пехотинцу, с параметрами способности (например, что там есть огненный выстрел). У пехотинца просчитываются резисты на этот тип урона, например Если "Щит" активирован, то урон - 25%. Там же считается вероятность уклонения и мы узнаем итоговый урон, если он есть. Далее отнимается хп и возвращается стрелку какие-то данные, если нужно.

На первый взгляд, я бы сделал так.


Сообщение отредактировал Egoor - Суббота, 23 Июля 2016, 02:22
SanchesДата: Суббота, 23 Июля 2016, 14:37 | Сообщение # 3
участник
Сейчас нет на сайте
Цитата Egoor ()
с параметрами способности

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

Пока лучшее, что пришло в голову - делать все расчеты на стороне атакующего/применяющего, в данном случае, лучника. То есть в коде способности "Выстрел" должна содержаться обработка навыка "Щит" у противника и проверка на наличие "Огненной стрелы" у себя. Тогда необходимо как-то классифицировать навыки во избежание многократного повторения кода (например, навык "Щит" должен учитываться ещё и при применении атаки в ближнем бою или заклинания)
Как классифицировать, тоже не могу придумать. Наследованием? Или каждому навыку добавлять набор категорий, к которым он принадлежит?
MR_BorgДата: Суббота, 23 Июля 2016, 17:14 | Сообщение # 4
участник
Сейчас нет на сайте
Можно сделать тип урона, например: физический, магический, огненный и т.д.
А у каждого воина юнита есть такая функия
Код

void Damage(damage types)
{
   hp-=fire + phys + magic;
};

Так же рассчитывать сопротивления тут.


Изучаю C++ попутно пишу игру.

Сообщение отредактировал MR_Borg - Суббота, 23 Июля 2016, 17:16
SanchesДата: Суббота, 23 Июля 2016, 17:41 | Сообщение # 5
участник
Сейчас нет на сайте
Проблема в том, что уроном дело не ограничивается, это был просто пример.
Суть именно в том, что одни и те же способности по-разному действуют на различные цели (применил "воодушевление" на зомби - он рассыпался, т.к. не переносит светлой магии)
GudleifrДата: Среда, 17 Августа 2016, 15:37 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата Sanches ()
Есть, например, юниты, у каждого - набор свойств и навыков (а-ля Герои - Минотавр имеет "Храбрость", лазутчик - "Отравленный выстрел")
Возникает, скажем, такая ситуация: лучник стреляет в пехотинца, применяя скилл "Стрельба". Пехотинец имеет навык "Щит", поэтому урон снижен. Однако лучник не простой, он имеет также способность "огненная стрела", поэтому пехотинец загорается. Но будь у пехотинца свойство "Несгораемость", не подгорел бы.
Ну, если бы существовало универсальное решение, то программирование не было бы искусством.

В чем же в данном случае это искусство заключается?
Налицо наличие некоторого набора фактов/правил на основании которых нужно произвести некоторые выводы/действия. Программированием чего программист и занимается всю свою сознательную жизнь. (Конечно, если Вы хотите тупо портить чужие игры, просто добавляя туда новый контент/фичи, это Вам нафиг не понадобится, но, допустим, Вы хотите стать программистом).

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

Прямая цепочка (перебираем факты, вычисляя новые):
if (лучник стреляет в пехотинца) применется_скилл = "Стрельба";
if (Пехотинец имеет навык "Щит") снижение_урона += от_щита;
if ("Несгораемость" & "огонь") огонь = 0;
if ("огонь") снижение_урона -= огонь;
и т.д. и т.п. В общем случае сведения правил в единую форму, позволяющую не прописывать все if-ы руками, см там.

Обратная цепочка (вычисляем факты по мере их запроса):
потери_от_огня_при_стрельбе() { if (стрельба()) снижение_урона(скилл, огонь()) }
снижение_урона(скилл, огонь) {}
огонь() {}
и т.д. и т.п. В общем случае сведения правил в единую форму, см там же.

Это знают все. Особенно изобретатели всяких там языков "логического", "автоматного и прочего хитрого программирования". Но подавляющее большинство почему-то забыло, что ВСЕ языки программирования, даже какой-нибудь ALGOL-60, УЖЕ являются машинами для подобных рассуждений. Наличествующие в той или иной мере в каждом языке механизм данных и процедур уже готовы к решению "рассуждательной проблемы". Механизм данных обеспечивает накопление фактов (прямая цепочка), механизм процедур - их запрашивает и использует (обратная цепочка). Все остальное, что есть в языке - способ как-то ограничить "область перебора", т.е. разбить и факты, и действия на изолированные группы, в которых и осуществлять логические вычисления. Т.е. не проверять все условия боя на мечах при расчете космических перелетов, и не проверять, как влияет бузина в огороде на поведение дядьки в Киеве.

Т.е. любой язык программирования - способ свести в одно целое оба "переборных" решения в одно работающее. И первая примета быдлокодера - жесткая фиксация "способа решения" для всех предложенных задач, а не совмещение прямого и обратного подхода по месту. Что-то они всегда считают заранее, а что-то по потребности. И совершенно не могут объяснить, почему. А супербыдлокодеры изобретают языки, которые фиксируют этот способ...


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Четверг, 15 Сентября 2016, 22:32
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг