DECORATE. Создаем мину

Предисловие

Мина это всего-лишь декорация, которая при соприкосновении с игроком взрывается, нанося урон. Создание мины важная тема, в ней мы впервые столкнемся с наследованием.

Написание кода

Для начала, скачайте спрайты мины с MEGA.

Напишите следующий код в DECORATE:

actor mine : SwitchingDecoration
{
  height 10
  radius 25
  +Solid
  Activation THINGSPEC_ACTIVATE
  +BUMPSPECIAL
  states
  {
    Spawn:
	  MINE AB 5
	  Loop
    Active:
	  MISL B 0 A_PlaySound("weapons/rocklx")
	  MISL B 6 A_Explode
	  MISL CD 6
	  stop
  }
}

Сразу бросается в глаза первая строка:

actor mine : SwitchingDecoration

В данной строке актор mine, наследуется от актора SwitchingDecoration.

Что такое наследование.

Наследование — это полное копирование кода одного актора, в другой. Имеет следующий синтаксис.

actor куда_копировать : откуда_копировать

Где:

  • Куда_копировать — название актора который получает весь код (свойства, стейты, флаги и т.д.).
  • Откуда_копировать — название актора с которого берется копия кода, и помещается в куда_копировать.

Зачем же это нужно? А затем что, порой, бывают случаи когда хочется изменить 1-2 свойства объекта не меняя всего остального кода.

Например, я хочу создать нового пинки, который бегает быстрее и имеет больше здоровья. Вместо того чтобы копипастить код с вики, и менять его под себя.

ACTOR MyDemon
{
  Health 500
  PainChance 180
  Speed 100
  Radius 30
  Height 56
  Mass 400
  Monster
  +FLOORCLIP
  SeeSound "demon/sight"
  AttackSound "demon/melee"
  PainSound "demon/pain"
  DeathSound "demon/death"
  ActiveSound "demon/active"
  Obituary "$OB_DEMONHIT" // "%o was bit by a demon."
  States
  {
  Spawn:
    SARG AB 10 A_Look
    Loop
  See:
................и так далее...................

Я унаследую код актора Demon(Пинки). И изменю свойства Health и Speed, чтобы сделать пинки быстрее, и увеличить ему здоровье.

ACTOR MyDemon : Demon
{
  Health 500
  Speed 100
}

Вот таким образом работает наследование. Наследование есть всех языках программирования, так что, вы не раз с ним столкнетесь в будущем.

Хорошо, так что насчет актора SwitchingDecoration?

SwitchingDecoration — это специальный актор, он встроен в ZDoom/GZDoom. Если ты хочешь чтобы актор мог стать активным, т.е. поменять свой стейт на Active, в зависимости от кода в ACS(Thing_Activate), или при соприкосновении с актором, или даже при нажатии кнопки USE(это название кнопки, которую ты нажимаешь чтобы открыть дверь) то тебе нужно наследоваться от этого актора(SwitchingDecoration), просто так устроен DECORATE.

С этой строкой разобрались:

actor mine : SwitchingDecoration

Продолжаем разбираться в коде.

Теперь разберем эту строку:

Activation THINGSPEC_ACTIVATE
  • Activation задает, условия активации.
  • THINGSPEC_ACTIVATE — значит, что во время активации, актор перепрыгнет на стейт Active.

Подробнее об Activation на вики.

+BUMPSPECIAL

Этот флаг(+BUMPSPECIAL) обозначает, что активация(переход на стейт Active) произойдет когда игрок прикоснется к актору.

Теперь разберем что происходит в стейте Active.

Стейт Active.

Код у него следующий.

Active:
	  MISL B 0 A_PlaySound("weapons/rocklx")
	  MISL B 6 A_Explode
	  MISL CD 6
	  stop

В этой строке:

MISL B 0 A_PlaySound("weapons/rocklx")

Задержка в 0 тиков, обозначает что действие будет выполнено мгновенно т.е. эти две комманды будут выполненны одновременно.

MISL B 0 A_PlaySound("weapons/rocklx")
MISL B 6 A_Explode

Я бы сделал так(ошибочный вариант):

MISL B 6 A_PlaySound("weapons/rocklx") A_Explode

Но, к сожалению, декорейт не позволяет выполнять две функции в одной строке, так что вариант выше приведет к ошибке.

Далее, разберем функции:

  • A_PlaySound() — проигрывает звук указанный в скобках.
  • A_Explode — создает урон по области(splash damage) такой же, как у ракеты после взрыва.

Со стейтом Active разобрались. Вообще, стейт Active является немного измененной версией стейта Death у ракеты, т.е взрыва ракеты.

Теперь, если вы заспавните мину(«summon mine» в консоли) то при соприкосновении с ней вы получите огромный урон.

Итоговый результат

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!