Dreamchest: Цепная Реакция



О переводе Всем привет. Я решил заняться переводом документации для игрового движка DreemChest. Не знаю, делал ли это кто-нибудь до меня, но надеюсь, что нет. Почему я решил начать с перевода «Цепной реакции»? Ответ прост: это самое интересное занятие и одновременно практическая часть всей документации.

Что ж, начнем.



Цепная реакция

В этом уроке будет представлен пример простой игры «Цепная реакция» (Название соответствует жанру).

Суть игры в том, что игроку необходимо как можно быстрее уничтожать постоянно появляющиеся объекты, нажимая на них мышкой.



Основа
Запустите движок и создайте новый проект. При его запуске вы увидите диалоговое окно, в котором вас попросят создать новый проект или загрузить уже созданный.

Введите название проекта и нажмите кнопку «Отлично».



DreamChest: Цепная реакция

По умолчанию в редакторе установлено только одно разрешение игрового экрана (320х480), но вы всегда можете добавить свое.

Дадим нашему проекту новое разрешение, например 640х480, для этого откройте выдвижное меню (Ну честно говоря, я не знала как его правильно перевести, поправьте меня если что), которое указано на изображении ниже на главной панели инструментов и выберите опцию «Редактировать».



DreamChest: Цепная реакция

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

Чтобы добавить новое разрешение, введите ширину и высоту в первом и втором окнах редактирования, а затем нажмите кнопку «Добавить».

Чтобы закрыть диалоговое окно, нажмите кнопку «Закрыть»; чтобы удалить разрешение, нажмите на него, тем самым выбрав его и нажмите кнопку «Удалить».



DreamChest: Цепная реакция

Теперь, когда новое разрешение добавлено, вы можете выбрать его из выдвижного меню; если вы выберете другое разрешение, границы сцены будут изменены.



DreamChest: Цепная реакция



Добавление ресурсов
Стандартный проект содержит только один htcehc с именем «root», который является единственным игровым уровнем (сценой).

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

Чтобы импортировать ресурс, щелкните правой кнопкой мыши (Правая кнопка мыши) на панели «Ассест» и в появившемся меню выберите «Импортировать Асест».

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

Добавим 2 спрайта «Enemy.png» («Враг») и «Bullet.png» («Пуля»).

Панель «Assest» расположена в правом нижнем углу, если вы не нашли ее, потому что ее не существует, вы всегда можете добавить ее через «Вид» -> «Assest»

DreamChest: Цепная реакция

Панель «Ассест» позволяет создавать ресурсы (скрипт, фигуру, объект сцены и т.п.

), а также импортировать готовые ресурсы (Спрайты, флеш-меню и звуки\музыка).

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

ПКМ по панели «Ассест» и в только что появившемся меню выберите «Создать» -> «Скрипт».



DreamChest: Цепная реакция

Прежде чем писать скрипт, выделим ресурсы «пуля» и «враг».

Загружаемое нами изображение можно перетащить в нашу сцену, но его нельзя вызвать через скрипт, если только этот скрипт не является основным классом объекта.

Чтобы мы могли создать объект из скрипта, давайте дадим классу нашего объекта уникальное имя, для «пули» это будет «bmpBullet», а для «врага» «bmpEnemy», мы всегда можем изменить имя объекта.

класс объекта в другой или запишите его, выделив его впервые на панели «Ассест», а затем на панели «Свойства» в строке «Класс» введите имя основного класса объекта.

Наш класс ресурса можно вызвать в любом другом ресурсе или прикрепить к другому объекту, но на данный момент нас интересует работа со скриптами.



DreamChest: Цепная реакция

Приступим к написанию нашего скрипта.

Прототип нашего скрипта будет содержать 1 класс и 8 методов.

Основной — Метод вызывается при запуске игры.

Каждый основной класс должен содержать этот метод. порождать врагов - Создает определенное количество объектов "Враг".

спавнВраг - Создает на сцене один объект «Враг» со встроенным спрайтом.

стрелять - Создает 4 пули по определенным координатам.

спавнПуля - Создает на сцене один объект «Пуля» со встроенным спрайтом.

onUpdate — Обновляет объекты (Координаты, состояние и т.д.).

обновлениеBullet - Позволяет объектам Bullet перемещаться по сцене и проверяет наличие столкновений с объектами Enemy. updateEnemy - Позволяет объектам противника перемещаться по сцене.

— Объявите класс Main, производный от Graphics. — Чтобы сделать этот класс стартовым, он должен быть ребенком - класса Графика.

класс "Основной"( Графика ) — Константы Main.Enemies = 50 Main.EnemySpeed = 100 Main.BulletSpeed = 500 Main.EnemyTag = 1 - основной — Точка входа, которая назначает слушателей сообщений и создает врагов.

функция Main:main() — Добавлены обработчики, реагирующие на клики и обновления.

Stage.attachListener( TapEvent.Up, function(e) self:shoot(ex, e.y) end) Stage.attachListener( GenericEvent.Update, self ) — Прямоугольник, задающий размер окна self.screen = Rect.new( 0, 0, Stage.getWidth(), Stage.getHeight() ) — Высвободите врагов self:spawnEnemies(Main.Enemies) конец - порождать врагов функция Main:spawnEnemies(количество) для i = 1, считать do self:spawnEnemy( Color.new( 0.0, 1.0, 0.0, 1.0 )) конец конец - спаун врага функция Main:spawnEnemy(цвет) — Создайте экземпляр класса bmpEnemy. Это тот же идентификатор — присвоено изображению врага на шаге 7. локальный e = bmpEnemy.new() e.relX = math.random() e.relY = math.random() e.dir = Vec2.randDirection() e.color = цвет e.speed = Main.EnemySpeed — Каждому объекту стадии можно присвоить тег.

Мы используем его для проверки — Столкновения пуль и врагов.

e.tag = Main.EnemyTag — Добавьте созданный объект на сцену я: прикрепить (е) конец - стрелять функция Main:shoot( x, y ) локальный цвет = Color.new( 1.0, 0.0, 0.0, 1.0 ) self:spawnBullet(x, y, -1, 0, цвет) self:spawnBullet(x, y, 1, 0, цвет) self:spawnBullet(x, y, 0, 1, цвет) self:spawnBullet( x, y, 0, -1, цвет) конец - спавнбуллет — Здесь происходит то же самое, что и в методе spawnEnemy функция Main:spawnBullet( x, y, dx, dy, цвет) локальная пуля = bmpBullet.new() пуля.

х = х пуля.

y = y Bullet.color = цвет Bullet.speed = Main.BulletSpeed Bullet.dir = Vec2.new( dx, dy ) self:attach( пуля ) конец —onUpdate — Обработчик сообщения обновления, вызываемый каждый кадр.

функция Main:onUpdate(e) местный я = 0 локальный n = self.totalChildren — Сканируйте список объектов сцены и обновляйте его.

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

в то время как я < n do локальный дочерний элемент = self:getChild(i) если child.tag == Main.EnemyTag, то self:updateEnemy( e.dt, дочерний элемент) еще self:updateBullet( e.dt, дочерний ) конец я = я + 1 конец конец — обновлениеПуля — Метод обновления маркера.

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

функция Main:updateBullet( dt, Bullet ) — Здесь мы используем ранее созданный объект класса Rect, чтобы — определить, вылетела пуля за пределы экрана или нет. если не self.screen:pointInside( Bullet.x, Bullet.y ), то — У каждого объекта стадии есть метод Release, который удаляет его со сцены.

— и называет это ненужным.

Через некоторое время память, используемая этим объектом - будет освобожден.

пуля: выпуск() возвращаться конец — Переместить пулю пуля.

x = пуля.

x + пуля.

каталог.

x * пуля.

скорость * dt пуля.

y = пуля.

y + пуля.

каталог.

y * пуля.

скорость * dt — Проверка столкновений пули с врагами делается так: — сортируем объекты относительно местоположения пули, радиусом равным — размер маркера и отфильтруйте их с помощью свойства tag. — поэтому обработчик будет вызываться только для объектов, — свойство тега равно Main.EnemyTag. Stage.forEachInRadius( self, Main.EnemyTag, Bullet.x, Bullet.y, Bullet.width, функция(объект, расстояние) — Мы нашли подходящий объект, который — означает, что произошло столкновение.

Стреляй в четыре - еще пули.

self:shoot( object.x, object.y ) — Удалить объект и пулю объект: релиз() пуля: выпуск() конец) конец — updateEnemy — Метод обновления противника.

Просто переместите его по экрану.

Оберните это вокруг — на другую сторону экрана, если он выходит за пределы поля.

функция Main:updateEnemy(dt, враг) враг.

x = враг.

x + враг.

dir.x * враг.

скорость * dt враг.

y = враг.

y + враг.

каталог.

y * враг.

скорость * dt локальный w = Stage.getWidth() локальный h = Stage.getHeight() если враг.

x < 0 then enemy.x = enemy.x + w elseif враг.

x > w, тогда враг.

x = враг.

x - w конец если враг.

у < 0 then enemy.y = enemy.y + h elseif враг.

y > h, тогда враг.

y = враг.

y - h конец конец

Скрипт-прототип нашей игры готов.

Но почему при запуске игры ничего не происходит (Для запуска игры нужно нажать кнопку «Старт» на главной панели инструментов)? Это связано с тем, что наш скрипт не выбирается стандартно при запуске игры.

Чтобы это исправить, вам нужно открыть выпадающее меню рядом с кнопкой «Пуск» и выбрать наш скрипт.

DreamChest: Цепная реакция



Тестирование и экспорт
Функция запуска проекта сделана для того, чтобы сэкономить время, которое мы тратим на компиляцию, чтобы протестировать то, что у нас получилось.

Чтобы приостановить работу игры в редакторе, необходимо нажать на кнопку «Стоп», которая заменяет кнопку «Старт» при запуске игры.

Если вы отредактировали проект и запустили его, но ничего не изменилось, значит, вы забыли его сохранить (Ctrl+S), только после сохранения изменений они станут видны при запуске игры.



DreamChest: Цепная реакция

Давайте запустим нашу игру.



DreamChest: Цепная реакция

Чтобы отделить наш проект от движка и экспортировать его на конкретную платформу, нам нужно в выпадающем меню «Файл» выбрать элемент «Экспорт» («Файл» -> «Экспорт»).

Там же вы можете настроить множество параметров экспорта.

(P.S. Экспорт занимает больше времени, чем простой запуск проекта, и гораздо дольше).



DreamChest: Цепная реакция

Теги: #DreemChest #переводы #уроки #Разработка игр

Вместе с данным постом часто просматривают: