Разработка игр на Lua часть 2: знакомимся с движком Corona

  • 18 Февраль, 2011, Kaktyska
    7344
    2

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

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

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

Все примеры и картинки мы будем приводить для Mac OS X, но пользователи Windows пусть не отчаиваются и качают версию движка для своей операционной системы – мы полагаем, что они очень похожи, если не идентичны. Правда, под Windows можно делать игры только для богомерзкого (шутка) Android-а, но для нас это не имеет никакого значения.

Какими мы будем пользоваться программами кроме самого движка? Да практически никакими. Нужен только текстовый редактор, желательно с подсветкой синтаксиса. Для Mac мы используем TextMate, но он платный. Из бесплатных можем посоветовать Smultron . А пользователи Windows могут попробовать Notepad++ - он хорош.
Убедившись, что редактор у нас есть, скачаем и установим сам движок. Для этого надо зарегистрироваться на сайте разработчика (не бойтесь вводить правдивую информацию – бесплатно пользоваться движком в тестовом режиме можно сколь угодно долго).

Установка версии для Mac не сложна, пользователям Windows придется устанавливать несколько дополнительных пакетов. Мы приведем тут только ссылки на англоязычные инструкции по установке, пусть работа с документацией будет вашим первым домашним заданием :)

Инструкция для Mac OS X
Инструкция для Windows

Далее для сборки вам может понадобиться XCode, но на первом этапе он не является необходимым.

Когда все подготовительные этапы пройдены, давайте запустим наш текстовый редактор и создадим в нем файл “main.lua”, который сохраним в папке TestProject на рабочем столе. На самом деле, мы уже создали работоспособную программу на движке Corona! Все, можете закрывать статью и жить дальше – цель достигнута! На самом деле в этой шутке есть доля правды: мы получили приложение, которое запускается и работает. Правда оно пока ничего не делает… Именно с этой проблемой нам предстоит разбираться.
Давайте подумаем, что мы чаще всего видим на экране телефона, когда играем в игры? Персонажи, фоны, элементы интерфейса…. Ведь это все – на самом деле картинки. Так что, если мы научимся отображать картинки, это будет большой шаг вперёд. Для начала найдем рисунок со звездочкой и поместим его в папку проекта (TestProject). После этого откроем в редакторе наш файл main.lua и введем следующее:

Теперь сохраните наш файл и запустите Corona. У меня он находится в папке «Приложения» - там лежит папка с Corona (у меня она называется «CoronaSDK», но у вас это имя может отличаться), а в ней есть программа «Corona Simulator». Она нам и нужна! Запускаем, заходим в меню File/Open и открываем нашу папку TestProject. После нажатия кнопки Open откроется окно с эмулятором iPhone, на котором вы увидите примерно следующее:

Итак, что же сделал наш код? Давайте разберем построчно:
local image = display.newImage( "star.png")
image – это переменная. С ними мы уже знакомы. Непонятное на первый взгляд слово local обозначает, что эта переменная принадлежит только этому файлу (main.lua) и вне него видна не будет. Local употребляется только один раз при первом упоминании переменной, то есть, при ее создании.

Далее следует функция display.newImage(“star.png”)
Как видим, имя функции содержит в себе точку, что на самом деле недопустимо для имен. Где же ошибка? Ошибки на самом деле нет, просто display.newImage – это не имя функции. Имя тут только newImage, а display – это название таблицы, в которой содержится функция newImage. Таблицы применяют для того, чтобы логически разделить функции, например в таблице display находятся функции для создания чего-то, что можно отобразить на экране.

У нашей функции display.newImage есть параметр, в котором мы видим имя картинки, которую поместили в папку с проектом. У меня она называется «star.png», у вас может иметь немного другое имя.

Итак, что же сделала наша функция? Она «открыла» картинку с жесткого диска и «запихала» ее в нашу банку-переменную. И теперь мы можем видеть эту картинку на экране!

Вторая и третья строчка очень похожи между собой:
image.x = 30
image.y = 100

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

Во-вторых, точка перед x и y говорит нам о том, что image – это на самом деле таблица, а x и y содержатся в ней. Запутались? Не пугайтесь. На самом деле все просто - для того, чтобы показать картинку, нам не достаточно просто знать, что на ней изображено, нам нужно знать и ГДЕ нарисовать эту картинку. Для этого мы используем координаты X и Y, как в школе на уроке математики. Но раз у нас программа, то нам надо куда-то записать эти координаты. Так почему бы не положить их в ту же банку, в которой уже хранится сама картинка? И теперь image – это не банка, а коробочка с отделами, в каждом из которых стоят банки: одна с картинкой, другая с координатой X, третья с координатой Y. Именно эти ящички мы и называем таблицами. Также их можно называть объектами, а переменные, содержащиеся в них – свойствами этих объектов.

image.x = 30
image.y = 100

Этими двумя строками мы говорим программе, где нарисовать нашу звездочку. В iPhone, в отличие от математики, точка отсчета лежит в верхнем левом углу. X увеличивается вправо, а Y вниз.

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

Поздравляю, у вас родилась ваша первая функция! Вон она, начинается со слова function, а заканчивается еще более «неожиданным» end, которое с английского переводится как «конец». После слова function идет ее имя и тут уже мы сами его придумываем. В принципе, можно навать как угодно, но лучше придумать что-нибудь свое, да еще и такое, чтобы было понятно, что функция будет делать. Имя onTap можно перевести как «во время тапа». Ну да, то, что надо.

За названием идет список параметров – тех данных, которые мы сможем использовать в функции. В нашем случае – это event, стандартный параметр всех функций – обработчиков событий. Именно в него будут записаны данные о том, где мы коснулись экрана.

Между первой строчкой и словом end находится «тело функции», где записываются действия, которые совершит наша функция. Наша функция берет координаты тапа и записывает их в свойства звездочки. Все просто до безобразия.

А теперь последняя строчка, которая и позволяет происходить магии:
Runtime:addEventListener("tap", onTap)

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

Функция addEventListener говорит программе: «Слушай эфир! Когда услышишь “tap”, тогда незамедлительно выполни функцию onTap!». И наша программа покорно начинает слушать.

Сохраняем, запускаем в симуляторе… Вуа ля! Все работает!

Ну что, на сегодня хватит?

Попробуйте поэкспериментировать: поставьте вместо “tap” “touch”, а потом вместо “Runtime” “image”. Посмотрите, что изменится. Если вы поймете, почему изменения повлияли на программу именно так, как это произойдет, то вы получаете не только виртуальную пятерку (мы сторонники олдскульной системы) но и «респект с уважухой».

В качестве домашнего задания, предлагаю вам почитать следующий текст. Там изложено все, что вам нужно знать о Lua для успешного изучения движка Corona далее.

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

Комментарии: