Swift. Игровой процесс. Как реализовать процесс одновременной битвы?
Добрый день, господа.
С вопросом к знатокам обращается начинающий iOS-разработчик (Swift).
На досуге решил написать для себя и друзей простую (логическую, не анимированную) игру с обыкновенными лейблами, списками, инпутами и прочей дефолтной дребеденью.
Однако встрял на самом главном и самом сложном, для меня, моменте.
В игре есть два объекта - Герой и Монстр.
Основной процесс игры это битва этих двух объектов.
У каждого из них есть параметры: Attack(Int), HP(Int) и AttackDelay(Float).
Суть вопроса заключается в следующем:
Каким образом организовать процесс их одновременной битвы, чтобы она заканчивалась в случае, если параметр HP одного из них станет равен нолю?
Как я понимаю - без всевозможных Threads/GCD/NSOperations здесь не обойтись? Но даже если так, то... как? =)
Что означает одновременная битва?
Вам нужно просто посчитать кто победит, или процесс битвы растянуть на несколько секунд?
Просто делайте расчет одного удара для каждого и заверните это в цикл, пока один из врагов не умирает.
Тут даже треды не особо нужны, если у вас нет никакой анимации.
Что означает одновременная битва?
Вам нужно просто посчитать кто победит, или процесс битвы растянуть на несколько секунд?
Просто делайте расчет одного удара для каждого и заверните это в цикл, пока один из врагов не умирает.
Можете делать внутри цикла задержку с привязкой к реальному времени, если хотите растянуть.
Тут даже треды не особо нужны, если у вас нет никакой анимации.
В разных реалтайм играх обычно существует отдельный тред-счетчик, который в вечном цикле крутит actions. То есть пробегает по всем персонажам, смотрит что этот персонаж сейчас делает (идет/стоит/дерется), выполняет для его персонажа кусок его активности (наносит удар, передвигается на xx расстояние, восстанавливает параметры...), тоже выполняется по объектам (что-то там строится, что-то там падает, что-от там открывается/закрывается).
В идеале вся эта активность умещается в пределах 1 секунды, а то и меньше, чтобы "тики" были одинаковые.
Можно крутить отдельные независимые треды для игроков, для монстров, для зданий, для ивентов. Или вообще отдельные процессы.
Можно крутить активность чаще или реже, просто синхронизироваться с часами реального времени.
Saboteur, параметр AttackDelay здесь указан не просто так)
Необходимо видеть сам процесс (например в формате прогресс-бара), а не только его результат.
Поскольку скорость атаки у Героя и у Монстра разительно различается - воспроизвести битву в одном потоке мне не видится реальным, в какие бы циклы я это дело не заворачивал.
Можете и два цикла крутить - в Lineage2, например, монстры обрабатываются одним процессом, игроки другим. Общение через базу данных.
Но в одном потоке вы тоже можете перебирать объекты (игроков и монстров) и кому-то обрабатывать активность каждый тик, кому-то просто помечать счетчик до следующей "активности".
Например статус "дерется", задержка "5". С каждым тиком задержка уменьшается, как станет "0" выполнится "дерется", затем новое действие, возможно с новой задержкой.
Причем вы всегда можете прервать текущий статус, если например монстр "заснул", "оглушен" или еще что-то.
В MUD-ах (старые CRPG), ве монстры и игроки обрабатывались одним циклом. И мы делали заклинания, которые кастовались несколько тиков именно таким способом - добавляли счетчик на активность.