Написание вашей первой игры для Android с использованием Corona SDK

Автор: Randy Alexander
Дата создания: 1 Апрель 2021
Дата обновления: 26 Июнь 2024
Anonim
КАК СОЗДАТЬ СВОЮ ИГРУ - УРОК ПО CORONA SDK #1
Видео: КАК СОЗДАТЬ СВОЮ ИГРУ - УРОК ПО CORONA SDK #1

Содержание


Самой популярной категорией в магазине Google Play всегда были игры. Хотя все мы, вероятно, используем ключевые приложения для повышения производительности, такие как веб-браузер, почтовый клиент и приложение для обмена мгновенными сообщениями, игры все еще остаются важной частью мобильного опыта. Поэтому неудивительно, что многие люди, которые хотят научиться разрабатывать для Android, хотят начать с создания игры. Кроме того, давайте будем честными, написание игры - это гораздо веселее, чем разработка приложения для повышения производительности!

Официальный язык Android - Java, а официальная среда разработки - Android Studio. Если вы хотите изучить Java, тогда я предлагаю наш учебник по основам Java, а если вы хотите узнать, как написать приложение с помощью Android Studio, тогда я предлагаю вам ознакомиться с нашим учебником по написанию вашего первого приложения для Android. Однако студия Java и Android - не единственные способы разработки для Android. Вы можете найти обзор доступных языков и SDK в нашем руководстве: Я хочу разрабатывать приложения для Android - Какие языки я должен изучать?


Одним из SDK, упомянутых в руководстве по языкам программирования, является Corona, сторонний SDK, предназначенный главным образом для написания игр. Вместо Java Corona использует Lua, быстрый язык сценариев, который легко выучить, но при этом мощный. Однако Corona - не единственный SDK для мобильных игр, в котором используется Lua, другие хорошо известные примеры включают Cocos2d-X, Marmalade и Gideros.

Загрузить и установить

Чтобы начать работу с Corona, вам нужно скачать и установить SDK. Перейдите на сайт Corona и нажмите кнопку загрузки. Вам нужно будет создать учетную запись (это бесплатно), прежде чем вы сможете скачать комплект. Если вы хотите создать настоящий файл .apk, а не просто запустить программу в эмуляторе, вам нужно установить Java 7, однако вам не нужно устанавливать Android SDK. Чтобы установить Java 7 Development Kit, перейдите на веб-сайт Oracle, найдите раздел «Java SE Development Kit 7u79» и загрузите версию для своего ПК.


После того, как вы установили Corona, вам необходимо активировать ее. Это разовый процесс, который бесплатен. Запустите Corona Simulator и согласитесь с лицензией. Введите адрес электронной почты и пароль, которые вы использовали для загрузки, и нажмите «Войти».

Начиная проект

В Corona Simulator нажмите «Новый проект». Введите имя своего приложения в поле «Имя приложения:» и оставьте остальные настройки по умолчанию. Нажмите «ОК».

Теперь появятся три окна. Первые два - Corona Simulator и Corona Simular Output. Corona также откроет окно проводника, отображающее файлы для вашего проекта.

Большинство файлов (около 23 из них) в каталоге проекта предназначены для значка приложения! Самый важный файл для нас сейчас main.lua, так как именно здесь мы напишем код для нашего приложения.

Введение в Lua

Прежде чем мы начнем писать код, нам нужно совершить экскурсию по Lua. Интерпретатор Lua (помните, что это язык сценариев, а не скомпилированный язык) доступен для Windows, OS X и Linux. Однако он встроен в Corona, поэтому вам не нужно устанавливать ничего лишнего. Самый простой способ играть с Lua - использовать онлайн-демо.

Вы можете найти много хороших учебных пособий по Lua в Интернете, и вам следует взглянуть на Справочное руководство по Lua, Программирование на Lua, The.Lua.Tutorial и Учебное пособие по Lua Tutorial.

Вот небольшая программа Lua, которая покажет вам некоторые ключевые особенности Lua:

локальная функция doubleIt (x) возвращает x * 2 end для i = 1,10,1 do x = doubleIt (i) если (x == 10), затем print ("ten"), в противном случае print (doubleIt (i)) end end

Приведенный выше код показывает три важные конструкции Lua: функции, циклы и операторы if. Функция doubleIt () очень просто, он просто удваивает переданный параметр Икс.

Основной код для цикл от 1 до 10. Он вызывает doubleIt () за каждую итерацию. Если возвращаемое значение равно 10 (т.е. когда я 5), то код выводит «десять», иначе он просто выводит результат doubleIt ().

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

Написание игры

Написание базовых программ в Corona просто. Вам нужно только побеспокоиться об одном файле, main.lua, и пусть Корона сделает всю тяжелую работу. Игра, которую мы собираемся написать, представляет собой простую игру «касанием». Воздушный шар или бомба упадут с экрана. Если игрок нажимает на воздушный шар, он набирает очко, он нажимает на бомбу, тогда счет будет разделен на 2, как штраф. Для написания кода нужно отредактировать main.lua, Вы можете сделать это в любом текстовом редакторе.

Corona SDK имеет встроенный 2D физический движок, который делает создание игр очень простым. Первым шагом в написании игры является инициализация физического движка:

локальная физика = требуется ("физика") phys.start ()

Код довольно понятен. Модуль физики загружен и инициализирован, он назначен переменной физика, Включить двигательphysics.start () называется.

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

halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5

дисплей объект - это заранее определенный объект, который Corona делает доступным глобально.

Теперь первый шаг, который действительно заставляет что-то происходить на экране:

local bkg = display.newImage ("night_sky.png", halfW, halfH)

А также свойства как contentHeight а также contentWidth, дисплей Объект также имеет множество полезных функций. новое изображение() Функция читает файл изображения (в данном случае .png) и отображает его на экране. Экранные объекты визуализируются в слоях, поэтому, поскольку это первое изображение, которое мы помещаем на экран, оно всегда будет фоновым (если код явно не делает что-то для его изменения). Параметры halfW а также halfH скажите Короне, чтобы поместить изображение в середине.

На этом этапе вы можете запустить код в эмуляторе и увидеть фоновое изображение. Если вы сохраните файл, то эмулятор заметит, что файл изменился, и предложит перезапустить. Если этого не происходит, используйте File-> Relaunch.

Поскольку пользователь будет набирать баллы за нажатие на всплывающие подсказки, нам нужно инициализировать переменную оценки и отобразить ее на экране:

Score = 0 ScoreText = display.newText (оценка, половина, 10)

Оценка будет сохранена в образно названной переменной Гол,а также scoreText это объект, который отображает счет. подобно новое изображение(), newText () положить что-то на экране, в данном случае текст. поскольку scoreText является глобальной переменной, то мы можем изменить текст в любой точке. Но мы скоро к этому вернемся.

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

Слева: только фон. Справа: фон и оценка.

Теперь приходит кое-что более хитрое, но не волнуйтесь, я объясню это построчно:

локальная функция balloonTouched (событие) if (event.phase == "begin") затем Runtime: removeEventListener ("enterFrame", event.self)

Приведенный выше код определяет функцию под названием balloonTouched () который будет вызываться каждый раз, когда шар постукивает. Мы еще не говорили Corona вызывать эту функцию каждый раз при нажатии на шарик, что произойдет позже, но когда мы сделаем это, то будет вызвана функция.

События касания или касания имеют несколько этапов, многие из которых поддерживают перетаскивание. Пользователь кладет палец на объект, это начальная фаза. Если они скользят пальцем в любом направлении, это фаза «движения». Когда пользователь убирает палец с экрана, это «завершенная» фаза.

Первая строка balloonTouched () Проверки мы находимся в «начальном» этапе. Мы хотим убрать шарик и увеличить счет как можно скорее. Если функция вызывается снова для других фаз, таких как «закончилась», то функция ничего не делает.

Внутриесли Заявление четыре строки кода. Давайте сначала разберемся с двумя последними, так как они проще.оценка = оценка + 1 просто увеличивает счет на один иScoreText.text = оценка изменяет текст оценки на экране, чтобы отразить новую оценку. Помнишь, как я это сказалscoreText был глобальным и мог быть доступен в любом месте, хорошо это то, что мы делаем здесь.

Теперь о первых двух строчках. Как только шарик или бомба упадут в нижней части экрана, он все еще будет существовать в памяти приложения, просто вы его не увидите. По ходу игры количество этих объектов за пределами экрана будет постоянно увеличиваться. Поэтому у нас должен быть механизм, который удаляет объекты, как только они оказываются вне поля зрения. Мы делаем это в функции под названиемзакадровыйо котором мы еще не написали. Эта функция будет вызываться один раз за кадр во время игры. После того, как наведен шарик, мы должны удалить его и удалить вызов, который проверяет, не наведен ли шарик за пределы экрана.

Линияevent.target:removeSelf () удаляет воздушный шар Когда происходит событие касания, одним из параметров функции слушателя являетсямероприятие параметр. Он сообщает функции о событии и о типе события, например,event.phase. Это также говорит нам, какой воздушный шар был повернут,event.target. removeSelf () Функция делает то, что говорит, она удаляет объект (в данном случае воздушный шар).

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

Итак, подведем итоги.balloonTouched ()проверяет, что это начало последовательности касаний. Затем он удаляет прослушиватель «enterframe», который является функцией, которая вызывается каждый кадр, чтобы увидеть, выпал ли шарик из нижней части экрана. Затем он удаляет всплывающее окно, увеличивает счет и отображает новый счет.

Это было для воздушных шаров, теперь нам нужно нечто подобное для бомб:

локальная функция bombTouched (событие) if (event.phase == "началось"), затем Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () Score = math.floor (Score * 0,5) = окончание счета

Как вы можете видеть, код очень похож, за исключением того, что вместо увеличения значения счет умножается на 0,5 (то есть делится на 2). Math.floor () Функция округляет счет до ближайшего целого числа. Так что, если у игрока было 3 балла и он взорвал бомбу, то новый счет был бы 1, а не 1,5.

Я упомянул закадровый() функционировать раньше. Эта функция будет вызываться каждый кадр, чтобы проверить, не ушел ли объект с экрана. Вот код:

локальная функция offscreen (self, event) if (self.y == nil) затем возвращает end, если (self.y> display.contentHeight + 50) тогда Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

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

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

Если объект все еще находится в игре, проверьте его положение, если он ушел за 50 пикселей от экрана, затем удалите его и удалите слушателя, чтобы закадровый() функция больше не будет вызываться для этого объекта. Код, чтобы убедиться, чтозакадровый() называется каждый кадр является частью следующего раздела кода.

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

локальная функция addNewBalloonOrBomb () local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) затем - БОМБА! local bomb = display.newImage ("bomb.png", startX, -300) phys.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) else - Balloon local balloon = display.newImage ("red_balloon.png", startX, -300) phys.addBody (balloon) balloon.enterFrame = offscreen Runtime: addEventListener ("enterFrame", balloon) balloon: addEventListener ("touch", balloonTouched) конец конец

Первая строка функции определяет, куда будет падать шарик Икс самолет. Если воздушный шар или бомба всегда падали посередине, это не будет очень интересно! ТакStartX это случайное число от 10 до 90 процентов ширины экрана.

Затем случайное число выбирается между 1 и 5.Если число равно 1, то бомба будет сброшена. Если это 2, 3, 4 или 5, то воздушный шар будет сброшен. Это означает, что бомбы будут сбрасываться примерно в 20% случаев.

Код бомбы и воздушного шара очень похожи. Сначала изображение (бомба или воздушный шар) отображается с помощьюновое изображение(). это Икс Положение это изStartX в то время как его Y положение установлено на -300, то есть от верхней части экрана. Причина этого в том, что мы хотим, чтобы объект падал из-за пределов области экрана в видимую область, а затем снизу. Поскольку мы используем движок 2D-физики, хорошо бы дать объекту немного начального расстояния, чтобы он мог набрать некоторую скорость.

Призыв кphysics.addBody () берет изображение, загруженное новое изображение() и превращает его в объект в физическом движке. Это очень сильно. Любой файл изображения можно превратить в тело, которое реагирует на гравитацию и столкновения, просто вызываяphysics.addBody ().

Последние три строки кода бомбы или воздушного шара настраивают слушателей. НастройкаenterFrame свойство сообщает Corona, какую функцию вызывать каждый кадр и вызовRuntime: addEventListener () устанавливает это. Наконец, призыв квоздушный шар: addEventListener () сообщает Corona, какую функцию вызывать при касании бомбы или воздушного шара.

И теперь игра почти завершена. Нам просто нужно еще две строки кода:

addNewBalloonOrBomb () timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Первая строка заставляет самую первую бомбу или шарик упасть, явно вызвавaddNewBalloonOrBomb (), Вторая строка устанавливает таймер, который будет вызыватьaddNewBalloonOrBomb () каждые полсекунды (500 миллисекунд). Это означает, что новый шар или бомба будут падать каждые полсекунды.

Теперь вы можете запустить игру в эмуляторе.

Вот полный список для main.lua, полный исходный код проекта для этой игры можно найти здесь, на GitHub.

-------------------------------------------------- --------------------------------------- - - Игра "Падающий шар и бомба" - Автор Гари Симс для - ------------------------------------------- ---------------------------------------------- - Запустите физический движок локальная физика = требуется ("физика") phys.start () - вычислить половину ширины и высоты экрана halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - установить локальный фон bkg = display.newImage ("night_sky.png", halfW, halfH) - Score Score = 0 ScoreText = display.newText (Score, halfW, 10) - Вызывается, когда игрок нажимает на воздушный шар. - Увеличить счет на 1 локальную функцию balloonTouched ( event) if (event.phase == "begin"), затем Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () Score = счет + 1 ScoreText.text = счет конец конец - Вызывается, когда игрок нажимает на бомбу - Половина счета является локальной штрафной функцией bombTouched (event) if (event.phase == "begin"), затем Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = end end end - Удалить объекты, которые выпали из внизу экрана локальная функция offscreen (self, event) if (self.y == nil) затем возвращает end if (self.y> display.contentHeight + 50) затем Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Добавить новую локальную функцию падающего шара или бомбы addNewBalloonOrBomb () - Вы можете найти red_ballon.png и bomb.png в локальном репозитории GitHub startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) если (math.random (1,5) == 1), то - БОМБА! local bomb = display.newImage ("bomb.png", startX, -300) phys.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) else - Balloon local balloon = display.newImage ("red_balloon.png", startX, -300) phys.addBody (balloon) balloon.enterFrame = offscreen Runtime: addEventListener ("enterFrame", balloon) balloon: addEventListener ("touch", balloonTouched) end end - добавьте новый шарик или бомбу. addNewBalloonOrBomb () - продолжайте добавлять новый шарик или бомбу каждые 0,5 секунды timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Следующие шаги

Следующий шаг - играть в игру на реальном устройстве Android. Чтобы создать файл .apk, нажмите Файл-> Построить для Android ... и заполните поля. В результате вы получите файл .apk, который вы можете скопировать на свое устройство и затем установить. Вам необходимо убедиться, что вы настроили свое устройство, чтобы разрешить установку приложения из неизвестных источников. У Amazon есть хорошая документация по этому вопросу, так как вам также нужно настроить ее для установки Amazon Appstore. В Corona также есть руководство о том, как подписывать, создавать и тестировать приложение на устройствах Android.

После успешной установки игры на ваше устройство, следующее, что нужно сделать, это улучшить игру. Например, почему бы не попробовать добавить звук «поп» или «взрыв», когда вы нажимаете воздушный шар или бомбу. У Corona есть API для этого:media.playEventSound ().

Или почему бы не попробовать добавить объект третьего типа, скажем, супер-буст, который удваивает текущий счет, или как насчет фоновой музыки?

Заворачивать

Писать игры с помощью Corona довольно просто, поскольку SDK поддерживает такие вещи, как OpenGL, и включает встроенный движок 2D-физики. Также Lua легка в освоении и не должна быть трудной для любого, даже с минимальным опытом программирования. На веб-сайте Coronalabs есть много документации, включая множество руководств и учебных пособий.

Менее чем за 100 строк кода у нас есть работающая игра. ОК, он не собирается выигрывать призы, однако демонстрирует мощь и гибкость Corona SDK.

Немецкий является одним из самых популярных европейских языков. Несколько стран используют язык и за пределами Германии. Трудно путешествовать в эту часть мира, не сталкиваясь с немецким языком. Это ...

Индонезийский является одним из самых популярных языков в мире. Это неудивительно, так как в Индонезии огромное население, и людям нравится туда ездить. Большинство людей покупают небольшие разговорн...

Интересные посты