[редактировать]

Игры и развлечения


Что такое прототипы и клоны?

Описание концепции клонирования.

В develnext для создания игр принята концепция клонирования, есть понятия Клон и Прототип. Очень часто в играх надо создавать множество одинаковых объектов с одним и тем же поведением и логикой, чтобы не дублировать код и объекты используйте клонов!

Итак, в итоге у нас:

  • Прототип - это оригинальный объект, он прародитель всех своих клонов.
  • Клон - полная копия-клон от оригинального объекта.
  • Клонирование - это полное копирование объекта, со всеми его свойствами, событиями и поведениями.

Создать клона от клона в DevelNext невозможно.


Прототипами могут быть только визуальные объекты.

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

Мы рекомендуем вам создать специальную форму для прототипов, назовите ее например Prototypes. Это хорошая практика. В эту форму добавьте все возможные предметы из игры, а затем на других формах вы сможете создавать клонов из формы Prototypes.


Как обратиться к клону в событиях объекта?

Как манипулировать клоном в событиях его прототипа.

На самом деле к клону из событий обращаться очень просто, это такой же текущий объект для события, как и оригинал:

$event->sender->free();

В итоге $event->sender возвращает текущий объект события, это работает и для клонов!


Совет

Используйте событие Клонирование, чтобы менять логику работы клона во время его клонирования. Обратите внимание, что это событие не срабатывает для объекта прототипа (оригинала).


Как получить массив всех клонов?

Получение клонов в виде массива от прототипа.

Всех клонов получить достаточно просто, есть специальный метод у всех форм:

$enimies = $this->instances('MainForm.enemy');

Обратите внимание, что в этот массив не попадает оригинал (прототип), от которого были созданы клоны.

Оригинал вы всегда можете получить по его id, так $this->enemy или $this->form('MainForm')->enemy.


Как уничтожить всех клонов объекта?

Описание того, как одним махом уничтожить сразу всех созданных и заданных через редактор клонов объекта.

Для этого достаточно получить список всех клонов по прототипу и уничтожить их, например так:

$this->instances('MainForm.enemy')->free();

MainForm.enemy это форма + id объекта, от которого были созданы клоны. Метод instance возвращает специальный объект, который может выполнять групповые операции - вызывать методы, менять свойства и т.д. сразу всем клонам.


Как сделать врагов, которые самоуничтожаются через несколько секунд?

О том как использовать паузы в коде, событие клонирование и метод уничтожения объектов.

Вариант первый

Используйте событие Клонирование, в котором пропишите паузу на нужное время, а затем уничтожение клонированного объекта:

// в событии клонирования

waitAsync(3500, function () use ($event) { // через 3.5 сек уничтожаем объект
    $event->sender->free();
});

Вариант второй

Используйте поведение Автоуничтожение (autoDestroy), добавьте его объекту-прототипу клонов, но отключите это поведение через свойство Отключить, выставите нужное время в свойствах поведения. Далее, в событии клонирования пропишите включение этого поведения, можно через код:

$event->sender->autoDestroy->enable();

Вы можете изменить время уничтожения через свойство поведения delay:

$event->sender->autoDestroy->delay = 3500;
$event->sender->autoDestroy->enable();

Как заставить объект возвращаться после ухода за видимую зону?

Рассказ о том, как использовать специальное поведение для возвращение объекта в зону видимости.

Для этого в develnext есть специальное поведение "Возвращаемость", оно находится во вкладке "Игра". Просто добавьте это поведение вашему объекту, выставите его свойства на свое усмотрение и ваш объект будет возвращаться если выйдет за видимую зону.


Как заставить объект двигаться?

Описание того, как задать скорость движения объекту, горизонтальную, вертикальную или угловую.

Для того чтобы объект сам двигался, можно попробовать несколько методов.

Физическая скорость объекта
Любому объекту можно задать постоянную скорость движения, однако прежде чем это сделать, необходимо добавить ему поведение Объект игровой сцены. Объект также должен находится внутри игровой комнаты, где работают законы физики или на форме с поведением Игровая сцена.

Скорость по X и Y можно задать через:

  1. Свойства поведения Объект игровой сцены (начальная скорость)
  2. Через следующий код:
$this->object->phys->hspeed = 5; // горизонтальная скорость
$this->object->phys->vspeed = 5; // вертикальная скорость

Вы можете задать общую скорость не меняя направление объекта:

$this->object->phys->speed = 5;

Или задать скорость вместе с направлением движения direction:

$this->object->phys->angleSpeed = [90, 5];

Где 90 это угол поворота (направление), возможное значение от 0 до 360 градусов, это описывает полный круг. А 5 это та самая скорость.

Анимация перемещения

Если вам нужно что-то по-проще, вы можете использовать методы анимации из класса action\Animation:

use action\Animation;

// смещаем кнопку вниз по Y на 100 пикселей 
// и на 10 пикселей по X вправо, время анимации 3 секунды (3000 млсек).
Animation::displace($this->button, 3000, 10, 100);

// заставляем двигаться объект к точке X:0, Y:0 за 7.5 секунд (7500 млсек).
Animation::moveTo($this->button, 7500, 0, 0);

Таймер + смещение

Самый примитивный вариант использовать таймер, внутри которого менять позицию нужного объекта, например, вы добавляете таймер в модуль, ставите интервал 1000 млсек (т.е. 1 сек) и опцию Повторять, а в событии таймера пишите код:

$this->button->x += 1;

Каждую секунду ваша кнопка будет смещаться на 1 пиксель вправо.

Не забудьте подключить модуль таймера к форме!


Что такое спрайт?

Простое описание концепции спрайта и спрайтовой анимации.

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

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

Спрайты главным образом используются в компоненте Игровой объект.


Как заставить объект отскакиваться от стенки?

Описание простого метода отскока от стенок во время события столкновения с ними.

Для этого необходимо задействовать событие Столкновение. Создайте объект, что-то вроде стенки, от которого будет происходить отскок. Добавьте событие столкновения с этой стенкой и внутри него пропишите код отскока:

use action\Collision;

Collision::bounce($event->sender, $event->normal);

Метод bounce() изменит угловую скорость объекта так, чтобы это напоминало отскок. Вы можете также задать третьим параметром коэфициент отскока, по умолчанию он равен 1.0, т.е. объект отскакивает с той же скоростью. Если вы хотите чтобы объект отскакивал например в 2 раза сильнее, то укажите коэфициент 2.0:

use action\Collision;

Collision::bounce($event->sender, $event->normal, 2.0);