~Basic ABS~
Есть множество способов реализовать боевую систему в реальном времени, всё зависит от твоих
требований к ней и естественно более продвинутая, проанимированная боевая система требует
не столько знаний, сколько терпения.
В данном уроке-примере я попытаюсь детально разобрать и объяснить, как создать простую, но
довольно практичную Action Battle System на RPGm 2k3... то есть дам ту основу,
отталкиваясь от которой можно создавать уже более продвинутые системы.
Для того, что бы понимать о чём идёт речь в уроке, ты уже должен знать основы работы в
мейкере и быть знакомым с такими страшными словами как "события", "переключатели" и
"переменные", если нет, то настоятельно рекомендую ознакомиться с этими понятиями
предварительно.
1. Боевая анимация
Для начала нам необходимо сделать боевую анимацию удара героя мечём по четырём
направлениям (вверх, вниз, вправо и влево). Делается это просто. Либо рисуем батлер сами
(особого таланта здесь не требуется), либо берём стандартный батлер "sword_battle.png" в папке
Battle из приложенной к этому уроку демки. Далее, заходим в базу данных мейкера
(
F8) и открываем вкладку "Анимация". Создаём там анимацию взмаха меча, как
показано на рисунке:
*К анимации так же можно добавить звуковые эффекты, которые
бы оживили анимацию. Делается это при помощи окошка Эффекты всё на той же
вкладке Анимация.
1-2. Движение героя при ударе
Итак, у нас получилось следующее:
Гм... чего-то нахватает, не правда ли?
Не хватает движения самого героя, это портит всю эстетику удара. Можно, конечно, всё
оставить и так, но я бы порекомендовал прорисовать всё детальнее, ведь именно от этого
зависит успех твоей игры.
Проанимировать героя можно несколькими путями, но самый простой (пускай и ограниченный)
способ, на мой взгляд, сделать это через charset картинки.
Для этого нам необходимо нарисовать отдельный чар, в котором герой делал бы выпад вперёд.
В итоге это будет выглядит примерно вот так:
То есть достаточно анимации из 2х кадров чарсетов:
…С выпадом удар будет смотреться примерно вот так:
1-3. Скрипт Атаки героя
Анимация сделана, теперь нам нужно научить нашего героя махать мечём по нажатию какой-
либо кнопки. Для этого действия в деме я выбрал кнопку ввода (Enter).
Заходим: База данных-]Общие события (common events) и пишем там следующий
код:
Пояснение к скрипту:
[1] - key input (Команда: Ввести пароль)
Эта команда назначает те кнопки, которые мы хотим задействовать, и записывает их значения
(set'ы) в переменную.
В данном случае, нам нужна только "кнопка подтверждения", которая имеет
значение 5.
Ставим галочку напротив неё и выбираем переменную, в которой у нас она сохранится
(Кнопки удара). Так же не забываем поставить галочку напротив пункта "Ждать пока
кнопка нажата", иначе наш герой будет неистово размахивать клинком, пока кнопка удара
нажата.
[2] - Branch if var (Команда: Разные условия)
Эта команда как раз и будет определять нажата ли кнопка удара или нет, и если нажата (то
есть, если переменная "Кнопки удара" имеет
значение 5), то выполняются ниже
описанные действия.
[3] - Через команду "Действие с переменными" назначаем новую переменную
"Удар героя" и ставим
значение равное 1. Эта переменная будет отвечать за
нанесение врагу повреждение равное силе атаки героя (об этом подробние чуть позже).
[4] - Тут хранятся простые условия обозначающие направления анимации удара героя,
то есть что бы герой бил в ту сторону, в которую смотрит. Здесь необходимо для каждого из 4х
направлений назначить по соответствующей им анимации или действию, которые будет
совершать герой при нажатии кнопки удара. То есть всё, что касается анимации удара
персонажа, пишется в этих условиях.
Анимация удара:
<> Change Sprite Association: Герой Hero-3
<> Show Battle Animation: Атака героя, Hero (Wait)
<> Change Sprite Association: Герой Hero-1
-Первая строчка скрипта меняет чар обычного состояния героя на чар с выпадом вперёд.
-Вторая строчка воспроизводит боевую анимацию.
-И третья строчка возвращает героя в исходное положение.
[5] - Ставим для переменных "Удар героя" и "Кнопки удара"
значение
равное 0. Это нужно для того, что бы условие не зациклилось и проявлялось только с
нажатием кнопки, а враг получал повреждение только после непосредственного удара героя.
Другими словами, просто отжимаем нашу кнопку атаки.
Код прописан, осталось только не забыть сделать условие для нашего события параллельным и
прикрутить его к новому переключателю (Режим боя), что бы можно было включать и
выключать режим боя в удобное для себя время.
2. Враги
Ну вот!))
Теперь, твой герой не только ходит, но ещё и бьёт чем-то вроде меча %)
Теперь для героя необходимо создать противника… ака злобного блоба - обитателя лесных
трущоб! ]:o
Делается это следующим образом…
На карте создаём событие, и именуем его "Враг" для удобства.
Выбираем врагу внешний вид, условие события ставим "Столкновение с героем" и
положение "Как герой"… а так же не забываем отметить тип движения - "К герою".
Скорость подбираем самостоятельно, по желанию (чем выше скорость врага, тем сложнее с ним
бороться).
Итак, на первой странице (всего их будет четыре) вражеского события мы прописываем сам ход
столкновения (боя) с героем:
Пояснение к скрипту:
[1] - Условия направления лица врага при ударе. Ну то есть, что бы враг при
прикосновении к герою "бил" в ту сторону куда он смотрит.
В данном примере у врага всего лишь одна боевая анимация "взмаха".Но при желании, удар
врага можно проанимировать ни чуть не хуже удара героя, всё зависит от фантазии и
терпения.
[2] - Ниже идут события после удара по герою.
<>Move event: This Event, Wait, Wait.
<>Simulated Attack: Герой with 5 Attack Power
<>Play Sound: Enemy_kick
<>Flash Sprite: Hero, 0,3 Sec (Wait)
- После удара по герою, монстр ждёт некоторое время (это нужно для того, что бы он не забил
героя беспрерывными атаками). Время ожидания определятся сложностью врага.
- Потом, прописываем с какой силой враг ударил героя (в данном случае сила врага равна
пяти).
- Звук удара по герою (тут можно задать не только механический звук удара, но и, например,
истошный вопль главного героя)
- И наконец, спрайт героя вспыхивает красным цветов, что бы показать игроку, что его герой
"получил в мясо".
Вторая страница содержит поведение врага после удара по нему.
Тут содержится:
- маршрут врага после удара (задаётся при помощи команды "Move Event");
- уменьшение жизней врага (заданные переменной "Жизни врага") посредством
вычитания числа из переменной равного атаки героя;
- вспышка спрайта врага (как и у героя, только белым цветом
);
- и звуковое сопровождение.
И ещё! Незабываем, обязательным предусловием поставить переменную "Удар героя"
равный 1. Это значит, что при соприкосновении врага и героя кнопка атаки была
нажата. Помнишь, мы ещё писали в общем событии "Удар мечём" строчку -
<>Variable Oper: [0003:Удар героя] Set, 1
Это и есть то условие, с которым противник получает удар равный силе героя.
На третьей странице содержится сцена смерти врага.
Предусловием этой страницы является переменная "Жизни врага", с помощью которой
мы задаём HP врага. И когда её значение ниже или равно нулю (читай
HP=0), то
включается это событие и враг умирает.
Смерть врага в активной боевой системе можно показать по-разному. Но обычно все
мейкеристы изображают это как полупрозрачный враг вращаться волчком и через секунду
исчезает.
Но тут опять же можно включить фантазию и терпение… сделать, например, что бы роботы
перед смертью взрывались, монстры истекали кровью и издавали рык, приведения испарялись в
воздухе... А можно и вовсе поставить целую драматическую сцену, как например, какой-нибудь
МидБосс перед тем, как отдать Богу душу кается в грехах, и вручив тебе ключевой предмет или
оружие откидывается.
Но что бы ты не придумал в сцене смерти, не забудь в конце неё поставить переключатель.
Переключатель, который бы переносил на 4ю (пустую) страницу события.
Эта страница выключает нашего врага, что бы он больше не появился. Поэтому на этой
странице пусто.
3. Рамка с показателями состояния героя
Как правило, неотъемлемой частью любой игры в жанре Action является как минимум
индикатор жизней главного объекта игры и наша ABS не исключение.
Сам индикатор жизней может выглядеть как угодно: в виде полоски, процентов или же
различных объектов (сердечек, камушков). Всё зависит от стиля игры и личных
предпочтений автора. Но реализация разных элементов происходит абсолютно по разному.
Сам простой способ реализации подобного индикатора HP безусловно это "полоска
жизненной энергии". В этом случае достаточно выставить условие, что бы от наносимого Герою
n'ного количества урона она смещалась на n'ное количество пикселов в сторону
убывания.
С цифирными индикаторами дело обстоит куда сложней, и поэтому ниже я приведу пример
именно по цифирному отображению HP героя... причём не самый лёгкий. Почему? Потому
что такая система отображения чисел является корневой, проще говоря, её можно применить
не только для отображения HP, но так же и для отображения других элементов статуса (MP,
уровень, деньги, опыт и пр.). К тому же разобрав и поняв подобную систему можно без труда
самому написать любой индикатор любой сложности.
Итак... Для начала нам необходимо нарисовать 10 картинок с цифрами, выглядеть они
должны примерно вот так:
*Незабываем делать небольшой пробел перед цифрами, так проще ориентироваться в
координатах для того, что бы цифры у нас не залазили друг на друга.
После этого нужно создать несколько общих событий. Поэтому, заходим в Базу данных-
]Общие события и создаём там 4 события:
Заполняем "Жизни для героя" командами:
[1] - Тут идёт разбиение реального числа HP на сотни, десятки и единицы. Что бы в
последствии представить целое число по частям.
P.S.: Если в игре у героя запланировано больше чем 999HP тогда не забудь дописать
сюда еще и разбитие на тысячи по той же логике что приведена в скрипте.
[2] - Далее идёт опрос скриптов отвечающих за отображение цифр на экране.
Перед тем как в событиях "Сотни HP", "Десятки HP" и "Единицы HP"
вписывать код необходимо определиться где ты хочешь разместить индикатор с HP.
Заполняем сотни:
Заполняем десятки:
Заполняем единицы:
Как мы видим заполнение этих трёх событий логически идентично, за исключением
положения картинок и переменных отвечающих за класс числа (1HP,10HP,100HP).
Ставим у всех трёх событий Условие: "Вызвать" и всё готово)
Вот, собственно и вся ABS.
Осталось понатыкать врагов по карте, отбалансировать у них силу
атаки, защиты, скорости и сделать великое множество разнообразных видов внешности.... В
общем, всё как ты любишь =)
Дополнительно:
В дополнение хотел бы объяснить два события расположенных на карте в демке.
Зима - эффекты
Это событие отвечает за некоторые эффекты, которые я применил для
локации в сценке боя. Обязательным условием оно для ABS не является! Просто визуальная
фитча.
Ставится параллельно
1. и 2. Включаем и показываем картинку со светом.
3. Включаем снег.
4. Останавливаем событие, что бы оно не повторялось снова и снова.
Начало боя
Событие, которое запускает наш бой.
Ставится параллельно
1. Вызываем нашу рамку с жизнями, при помощи события "Жизни для
героя".
2. Показываем рамку с аватаркой героя.
3. Назначаем переменной "Жизни врага"
значение равное 50, то есть
присваиваем врагу 50HP.
4. Включаем "Режим боя", что бы позволить герою размахивать мечём.
5. Вырубаем это событие что бы не повторялось.
Вот... самая простая, но практичная ABS Готова!