Corona sdk примеры игр

Видеоурок

Безусловно, есть такие игровые движки как Unity и Unreal , которые отлично подходят для 3D игр . Однако, Corona SDK это игровой движок для создания 2D игр и она является отличным конкурентов в этой сфере.

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

В редакторе есть встроенный симулятор, позволяющий посмотреть результат выполнения игры на большинстве популярных девайсов. Кроме того, здесь также есть Live Builds. Так, вы можете сделать Build игры, раскидать её по девайсам, которые у вас имеются и при изменении чего либо в игре сразу смотреть корректно ли это работает на ваших устройствах.

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

Имеется хорошая документация , а также отзывчивая тех-поддержка. Движок использовался в игре Rider от Ketchapp, Gunman Taco Truck , которая разработана Джоном Ромеро, программистом, известному по таким играм как Doom, Quake и Wolfenstein 3D, а также движок использовался во многих других играх.

Пишем простую, но весьма азартную игрушку. Игра называется Crush т.е. в ней нужно будет давить насекомых, пытаясь избежать давления Ос, так как они отнимают очки, другие насекомые добавляют очки. Все насекомые имеют различные показатели размеров, награды и скорости перемещения. На игру дается определенное время поэтому в мастерстве давления правильных зверьков вы вполне сможете посоревноваться с друзьями. Лучший результат фиксируется и сохраняется в настройках игры.

Настройки проекта

Все настройки проекта содержатся в файлах config.lua и build.settings. Все содержимое config.lua я решил удалить оставив только строку:

теперь проект на пытается на любом устройстве «думать» что экран имеет фиксированный размер 320*480(как это было по умолчанию), мы работаем всегда с текущим разрешением экрана. В файл build.settings я добавил в секцию settings.android.usesPermissions новое разрешение дающее право жужжать вибросигналом при касании к осам, добавлены следующая строка: «android.permission.VIBRATE», Теперь при установке приложения на устройство android спрашивает вашего разрешения на использование виброзвонка, а строка кода system.vibrate() эти права использует.

Точка входа main.lua

Театр начинается с вешалки, а проект в короне с перовой строки файла main.lua. В этом файле принято хранить глобальные переменные и константы, а так же подключать к проекту остальные файлы которые в проекте будут нужны. В конце файла загружается главная сцена проекта.

Полный код файла main.lua имеет вид:

Главная сцена

Файл scMain.lua — главная сцена игры. В данном проекте его применение сомнительно, так как сцена всего одна, но проект учебный и сцена может пригодится если в своих экспериментах вы решите добавить еще сцены. В главной сцене выполняется всего одно действие — запуск функции init() из библиотеки libGame. И дальше эта функция отрисовывает весь постоянный интерфейс игры, т.е. те части которые не будут удаляться до конца использования приложения. Код файла такой:

Сервис статических компонентов игры.

Этот сервис хранится в файле svcGame.lua и ее подключение к проекту выполняется строкой в main.lua: game = require «svcGame» т.е. дальше по коду для вызова функций библиотеки мы дописываем к названию game. Библиотека имеет следующие функции:

  • game.init() — выполняется один раз, при этом создается трава, верхний и нижний бортик меню, компоненты отображения текущего и лучшего результата, кнопка запуска игры, компоненты показывающие таймер боя.
  • game. refresh() — эта функция выполняется каждый раз при любой изменении в параметрах игры, а это убийство насекомого (обновление счета) и тика таймера боя (обновление полосы прогресса). Функция актуализирует текущее состояние всех индикаторов.
  • game. startGame() — обработчик нажатия на кнопку start. Функция обнуляет текущий результат и запускает таймер игры на период указанный в константе time_battle. В таймере создаются насекомые.

Полный код svcGame.lua:

Сервис создания насекомых

Сервис имеет несколько составных частей, которые обслуживают возможность удобного создания живности в игре:

  • bugs.bugs — настройки насекомых. Насекомое можно настроить, увеличив или уменьшим его доступность
  • bugs.create — создается насекомое, вычисляется его траектория пути, отправляется в путь. На каждом насекомом имеется обработчик, который делает насекомое непробиваемы для клика, т.е. вы не можете одним кликом убить это насекомое и то которое находится под ним. Так же обработчик при клике удаляет насекомое, обновляет счет игры и вызывает функцию создания нового насекомого, если часто убивать насекомых их количество будет увеличиваться быстрей чем если просто на них смотреть.
  • bugs.plod — создает кляксу на месте смерти насекомого. Клякса удаляется сама через пол секунды

Код сервиса svcBugs.lua имеет вид:

Сервис «Финиш»

Этот простой сервис имеет всего одну функцию finish.show() которая вызывается в таймере боя при достижении конца сражения. Эта функция удаляет всех насекомых и открывает форму с выводом результата. Если результат выше прошлого лучшего значение выдается текст «NEW SCORE». Под формой создается защитный слой не дающий заново запустить игру до закрытия окна. При клике по окну оно закрывается результат сохранять в файл настроек. Код сервиса имеет вид:

Библиотека хранения и загрузки настроек

Эта простая библиотека содержит две функции позволяющие обеспечить хранение результата между игровыми сессиями.

  • ls.load() — выполняется один раз при старте игры и если этот старт первый, происходит создание шаблона сохранения, если не первый происходит загрузка результата прошлых игр.
  • ls.save() — выполняется после каждого сражения, при этом текущий результат сохраняется в файл.

Хранение настроек осуществляется в файле config.dat в формате json. Код библиотеки имеет вид:

Библиотека универсальных функций.

Тут хранятся все функции которые нужны в игре но в явной форме не относятся к какому-то модулю и в последствии могут быть использованы для других целей. Имеются следующие функции:

  • api.play_sound — воспроизводит музыкальный файл(.wav), расположенный в assets/music/ имя которого передано в параметре
  • api.get_xy_line — возвращает координаты случайной точки лежащей на отрезке двух переданных в параметре точек. Функция используется при генерации случайных начальных и конечных точек движения насекомых.
  • api.get_line_len — возвращает длину отрезка переданного двумя точками. Функция используется при вычислении времени в пути насекомого через длину и скорость.
  • api.get_angle — определяет угол между первой переданной точкой из которой проведен луч идущий вверх и лучом направленным на вторую точку. Функция используется для определения угла поворота картинки насекомого.

Заключение

Полный исходник игры представленной в статье вы найдет в тут

Если ваши знания языка Lua не позволяют вам уверено читать исходник можете ознакомиться с моей статьей по этому вопросу.

Статью для вас подготовил Денис Гончаров aka execom
Всем удачи!

Corona SDK — это кросс-платформенный движок для создания игр под iOS и Android. Лично мне он нравится своей простотой освоения: пятерка в школе по паскалю — достаточный багаж знаний для покорения «короны». На хабре уже есть несколько статей на эту тему, но подробных уроков для начинающих как на этом, так и на других русскоязычных сайтах очень мало.

В этой статье я расскажу об одном из ключевых вопросов работы с Corona SDK — организация нескольких сцен в одном приложении.

Для этого существует специально разработанное средство — StoryBoard API, которое пришло на смену стороннему классу Director.

Рассмотрим небольшой пример, который объяснит как:

  • создавать сцены
  • переключаться между сценами с различными эффектами
  • передавать переменные между сценами

Наше приложение при запуске будет показывать меню, состоящее из трех кнопок, каждая из которых ведет нас на отдельную сцену. Соответственно, у нас будет 4 сцены, для каждой из них нам понадобится создать файл с одноименными названиями (menu.lua, scene1.lua, scene2.lua, scene3.lua) и основной файл main.lua:

Начнем наполнять приложение по порядку. В основном файле проекта main.lua запишем следующие строки:

Первая строка подключает библиотеку storyboard к нашему приложению, во второй строке мы храним переменную prevScene, которую потом передадим в другие сцены, ну а третья строка перенаправляет на сцену menu.

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

Во-первых, перед тем, как добавлять свой код в четыре стандартных события (createScene, enterScene, exitScene, destroyScene) следует объявить используемые нами переменные. В меню у нас будут задействованы переменные для фона, трех кнопок и текстовой надписи с мониторингом памяти.

Далее создаем наш фон, кнопки и надпись внутри функции function scene:createScene( event ). Также, в этой части нашей программы размещаем функции, которые будут менять сцены по нажатию кнопки. Все это однотипные простейшие функции создания изображений и текста из стандартного набора Corona. Поэтому, для сокращения количества текста, приведу здесь лишь строчки, отвечающие за первую кнопку, остальное по аналогии. Ну а всем кому интересно, могут скачать полные исходники в конце топика.

Отмечу лишь, что параметр «fromRight» у функции storyboard.gotoScene() задает эффект появления новой сцены справа. Соответственно, можно задать эффект появления слева, сверху или снизу(fromLeft,fromTop или fromBottom), плюс классическое затемнение (fade). Параметр 800 — это время выполнения эффекта в милисекундах. Это не все эффекты, полный список можно почитать в официальной документации разработчиков.

Теперь надо поставить небольшое условие, которое будет очищать память устройства от предыдущей сцены, в зависимости от значения переменной prevScene. Очень важно не забывать очищать память функцией storyboard.removeScene(), иначе ваше приложение будет потреблять много ресурсов и в конце концов может просто зависнуть.

Делаем мы это при загрузке новой сцены внутри функции function scene:enterScene ( event ), там же оставим стандартную функцию из примеров разработчиков Corona по мониторингу памяти.

Сохраняем файл, запускаем симулятор и смотрим нашу первую сцену. Т.к. это menu.lua, то я решил сделать меню, но не программное, а для простой столовой:

Ну и наконец, создаем три сцены-клона нашего меню, но:
1. Без кнопок.
2. Каждая сцена со своим предметом на столе (тарелка борща, тарелка макарон или стакан компота)
3. Обновляем нашу общую у всех сцен переменную и немного меняем строчку с удалением из памяти предыдущей сцены, т.е. функция storyboard.removeScene() удаляет конкретно menu.lua, т.к. это единственно возможная предыдущая сцена:

4. Добавляем возможность возврата в меню по нажатию на картинку-фон. Для этого добавим в раздел createScene функцию возврата в меню:

В разделе enterScene привяжем к нашему фону eventListener, который будет следить за прикосновениями, и в положительном случае отправит программу выполнять нашу функцию onSceneTouch():

Ну и, разумеется, не забудем убрать eventListener, при выходе из сцены в разделе exitScene()

Заполним по этим правилам все три сцены:


Тот же результат можно получить используя только две сцены: меню и еще одна, которая в зависимости от активированной кнопки будет показывать разные продукты(простое условие и одна глобальная переменная). В качестве закрепления изученного материала, попробуйте реализовать данный механизм.
Если мы все сделали верно, то память, занятая приложением, не должна увеличиваться с каждым переходом на другую сцену. Следите за этим в своих приложениях.

Ну вот и все. Разные сцены мы создали, с эффектами по ним прошлись, ну и переменную prevScene передали. На этом знакомство с storyBoard API можно считать завершенным.
Исходники урока можно скачать здесь.
Исходники примера работы storyboard API от разработчиков Corona SDK смотреть тут.


[an error occurred while processing the directive]
Карта сайта