Окт 16

02Держу пари, что сегодня утром, когда вы проснулись, ваша первая мысль была: «Я хочу создать игру Doodle Jump и написать 300 строчек кода».

«Ах да, и я хочу чтобы игра работала на iPhone и Android и чтобы код был прост, как три копейки».

Ваше желание исполнится ☺

В этом уроке состоящим из 2-х частей мы сделаем игру на популярном и простом в использовании движке для iOS и Android под названием Corona. По окончании изучения этой серии уроков вы узнаете:

  • Как создать игру с помощью Corona.
  • Плюсы/Минусы Corona и cocos2d
  • Как делать уровни в LevelHelper
  • И, конечно же, как сделать игру на подобие Doodle Jump!

Этот туториал нацелен на новичков в Corona, но он будет полезен и более опытным девелоперам.

Так же, неплохо, если у вас есть опыт работы с LevelHelper и SpriteHelper. Однако, если эти названия вы слышите впервые, рекомендую ознакомиться с этим уроком. Не переживайте если у вас нет этих утилит или опыта работы с ними, т.к. вы сможете использовать готовые спрайт листы (sprite sheet) и уровни, если потребуется.

Ну что ж, начнем!

Что такое Corona?

Хотя большинство из вас наверняка знакомы с cocos2d , вы можете ничего не знать о движке Corona.

Начнем с того, что же такое Corona.

Corona – это кросс платформенный игровой движок, поддерживающий платформу iOS и Android. Движок разработан компанией Ansca и для разработки вы можете использовать триальную версию Corona. Когда появится желание опубликовать свое приложение в App Store придется купить лицензию. Цена колеблется от 199$ до 349$.

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

В Corona есть симулятор для тестирования ваших приложений.

В Corona встроены некоторые API необходимые для программирования (спрайты, звук и т.д.) а так же доступны API от Apple включая Game Center, In App Purchase (продажа контента внутри приложения) и TableViews.

Так же есть ряд сторонних API таких как Open Feint, inMobi (реклама), Flurry (аналитика). Ко всем API от Apple у Corona доступа нет. Например не удастся воспользоваться iAds, Game Center Multyplayer и соединением по Bluetooth.

Corona vs Cocos2D

Теперь давайте поговорим о разнице между Corona и Cocos2D.

Прежде всего, Corona и Cocos2D имеют немало общего:

  • Позиционировать спрайты в Corona очень просто. Нужно установить свойства .x/.y для спрайта.
  • Есть масштаб, поворот и альфа свойства (alpha property) связывающие отображаемые объекты.
  • Метод “transition.to”, который анимирует позицию, масштаб, поворот и т.д.
  • Corona использует физический движок Box2D, поэтому методы и свойства должны быть вам знакомы, если вы использовали Box2D в cocos2d.
  • Как и cocos2d, Corona использует спрайты, текстовые лейблы (text labels), методы рисование примитивов, но все это называется иначе. Любые объекты, которые появляются на экране имеют общее название “отображаемые объекты” (display objects), которые похожи на CCNode в Cocos2D. В Corona есть отображаемая группа (display group), которая функционально похожа на CCLayer в Cocos2D.

Помимо сходств, у этих движков есть существенные различия:

  • В Cocos2D используется язык Objective-C, в то время как Corona использует Lua. API в Corona находятся под сильным влиянием Action Script. Flash разработчики считают Corona очень дружелюбной средой. Код в Corona может быть написан согласно модели ООП, но модель функционального программирования более распространена.
  • Cocos2D позволяет интегрировать сторонние библиотеки написанные на Objective-C. Corona в свою очередь закрытая система. Хотя на Lua и написаны некоторые сторонние библиотеки, но в настоящее время для Corona их всего несколько.
  • И, конечно же, Corona платная, а Cocos2D бесплатна.

Я знаю какой вопрос вас мучает – какой движок следует выбрать? Лучшим ответом станет список плюсов и минусов Corona по отношению к Cocos2D.

Плюсы:

  • Время на разработку. Создание игр в Corona зачастую быстрее и проще чем в Cocos2D. Так как используется язык Lua, добвление переменной объекта не требует ничего более, чем назначение (например: Sprite.newvalue = 0). Движок Box2D интегрирован, так что спрайт объекта и физика тела это один объект. Вам не придется писать файлы интерфейста, декларировать дубликаты переменных или декларировать типы данных переменных (здесь есть некоторые исключения).
  • Кросс-платформенность. Если вы создаете игру в Corona, то она будет работать как на iOS так и на Android, как говориться “из коробки”.

Минусы:

  • Нехватка поддерживаемых API. Corona не имеет доступа ко всем API от Apple, или так много сторонних дополнений как Cocos2D. Сетовой мультиплеер должен быть написан с нуля. Проходит немало времени прежде чем интегрируются новые фишки от Apple.
  • Низкая производительность. Так как Corona работает с Lua, ваш код не будет работать так быстро как если бы использовался Objective-C.
  • Corona платная. За Corona придется заплатить, если вам нужно будет опубликовать приложение. Cocos2D - совершенно бесплатна.

Начнем знакомиться с Corona.

Если Corona у вас еще не установлена, то скачивайте триал версию и установите. Триалка полностью функциональна, за исключением возможности публиковаться в App Store. Перейдите на сайт и скачайте/установите Corona (нажмите “download trial” вверху).

С Corona я работаю на Mac, но имейте ввиду, что вы можете пользоваться Corona и на PC. Однако, вы не сможете собрать iOS билд без Mac’а, только билд для Android.

Когда закончится установка, в папке Applications появится папка Corona. В этой папке лежат различные исполняемые файлы. Я рекомендую всегда запускать Corona выполняя Corona Terminal. Это откроет окно терминала вместе с Corona Simulator. Терминал даст вам лог ошибок или print().

Как упоминалось ранее, в Corona нет IDE. Я пишу большую часть кода в простом текстовом редакторе. Дебаггер мне кажется неудобным. Вы можете использовать Xcode как текстовый редактор, а так же для Corona есть плагины для подсветки кода, но они работают не со всеми версиями Xcode.

Итак, откройте новый текстовый файл и добавьте следующий код:

display.newText( "Hello World", 20, 160, "Helvetica", 50 )

Как вы поняли, этот код выводит на экран надпись “Hello World” с позициями X=20 и Y=30 в 50-ти точках шрифтом Helvetica.

Сохраните свой текстовый файл. Он должен называться “main.lua”. Запомните, что этот файл является отправной точкой любой программы в Corona.

Откройте Corona Simulator, либо запустив Corona Simulatior.app, либо, как я рекомендовал через Corona Terminal. Перейдите File->Open, найдите ваш файл. Оба этих файла лежат в папке Corona в Applications.

1-corona

Поздравляю, теперь вы разработчик Corona. Что может быть легче чем это? К вашему сведению, чтобы сделать билд для устройства в Corona, вам понадобится аккаунт Apple Developer.

Создание спрайт листа (sprite sheet).

Прежде чем мы перейдем к Doodle Jump, нам нужно создать спрайт лист. Так как мы собираемся использовать LevelHelper для создания уровней для игры, мы будем использовать SpriteHelper для создания спрайт листа.

Если у вас нет SpriteHelper’а не стоит волноваться, вы сможете воспользоваться готовым “спрайт листом” и перейти к следующему разделу.

Но если вы успели приобрести SpriteHelper, продолжайте читать по порядку.

Для этого проекта вам понадобятся некоторые ресурсы, так что скачивайте все по этой ссылке и распаковывайте. Внутри папки спрайтов вы увидите изображения, которые мы будем использовать. Бесплатный пак с изображениями предоставила Viki, жена Ray’а.

Теперь нужно настроить ряд атрибутов физики. Мне нравиться делать это с помощью Sprite Helper’а, но эти свойства позже могут быть установлены и в Level Helper’е. В этом уроке я покажу вам как устанавливать атрибуты в Level Helper’е. Углубляться в подробности использования SpriteHelper/LevelHelper мы не станем, так как эти вопросы были рассмотрены в соответствующем уроке (на английском).

Запустите SpriteHelper и перетащите все спрайты в окно.

2-corona

Выберите File-> Save, укажите директорию где лежит main.lua и введите как имя “cloudSprites”. Необходимые расширения будут добавлены автоматически. В итоге создастся три файла - cloudSprites-hd.png, cloudSprites.png и cloudSprites.pshs (прокт SpriteHelper’а).

Создаем уровень в LevelHelper.

Теперь воспользуемся LevelHelper’ом для создания уровня игры. Напомню, если у вас нет указанной утилиты. Можете взять готовый уровень из необходимых ресурсов для игры о которых мы говорили ранее.

Если LevelHelper у вас есть, то запустите его и кликните “+” в Project. Введите cloudJumper и выбирите “iPhone Portrait (320×480)” и нажмите “Create New Project”.

3-corona

Внизу окна LevelHelper найдите раздел Game World Size и замените установленные значения на 0, 0, 320, 9600. Также добавьте эти значения в Physic Boundaries. Установите gravity на 0, -10.

4-corona

Нажмите “+” возле выпадающего меню выбора сцены справой стороны. Выберите файл cloudSprites.pshs, который недавно был создан SpriteHelper’ом. Теперь все ваши спрайты загружены в панель спрайтов.

Переместитесь в самый низ уровня.

Первое, что мы сделаем, это загрузим фоновые облака. Перетащите три облака – bg_cloud1, bg_cloud2 и bg_cloud3 в нижнюю секцию. Выделите все три спрайта.

Установите тип физики для облаков на “No Physic”. Установите свойство Z Order на “-2”. Мы хотим чтобы эти облака всегда были далеко на фоне.

5-corona

С помощью инструмента Clone and Align сделайте 19 (или около того) копий всех трех спрайтов. Вы можете отступ по Y на “-480” чтобы разместить один блок облаков для каждого экрана. Следуйте по экрану и располагайте облака. Не зацикливайтесь на одних и тех же положениях, чтобы не выглядело одиникого.

Когда вы закончите, выделите все спрайты облаков и нажмите кнопку с замком. Теперь, когда кнопка нажата, спрайты не могут быть выбраны в макете. Это облегчает позиционирование других спрайтов поверх этих. Если необходимо подредактировать заблокированные спрайты, сделайте это в списке “Sprites in Level” и нажмите ту же кнопку, чтобы разблокировать их.

Теперь перетащите спрайты cloud1, cloud2 и cloud3 в низ уровня. Присвойте этим спрайтам свойства как показано ниже:

Cloud 1

6-corona

Cloud 2

7-corona

Cloud 3

8-corona

Несколько моментов на заметку. Все облака имеют значение “Z Order” -1. Это установит их поверх наших фоновых облаков, но позади всего остального. Белые и серые облака являются сенсорами (sensors). Мы будем пролетать через них и отскакивать только падая на них сверху. Синие облака не являются сенсорами, поэтому их придется избегать и это сделает игру сложнее.

На всех облаках в “Category Bit” стоит значение “1”. Нам нужно, чтобы монстры и стрелы двигались через них без столкновений, поэтому мы установим атрибуты маски этих объектов соответствующим образом. Убедитесь в правильности установленных значений в physic type, shape border и TAG. Не беспокойтесь если число в tag отличается от показанного выше, только имя имеет значение.

Если у вас есть вопросы касательно этих свойств, ознакомьтесь с этим уроком (английский).

После того как все свойства установлены, используйте инструмент Clone и создайте столько видов каждой платформы сколько вам нужно. Установите их так, чтобы играть было весело и интересно.

Вот несколько советов по созданию уровней:

  1. Уровень должен начинаться легко, чтобы игрок успел понять что от него требуется.
  2. Уровни не должны повторяться.
  3. Игрок прыгает примерно на 200 пикс. максимум, поэтому убедитесь, что он может прыгнуть с одной платформы на другую.
  4. Серые облака – отвлекающий маневр, они исчезнут после приземления
  5. Синие облака трудны тем, что игрок не может пройти через них и они узкие.
  6. Пик сложности должен наступать ближе к концу уровня.

9-corona

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

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

Добавляем игрока.

Теперь, когда все облака расставлены, мы можем представить игрока. Перетащите спрайт char_jump2 в нижнюю часть экрана над одним из облаков. Присвойте ему следующие свойства:

10-corona

Игрок будет сталкиваться с облаками, монстрами, поэтому значение “Mask Bit” нужно установить на 5.

Теперь нам нужно сохранить уровень и сгенерировать код. Выберите File-> Save и назовите файл “level1”, остальные расширения будут созданы автоматически. Также выберите File->Generate Code->Corona, создастся файл LevelHelperLoader.lua. Этот файл надо перегенерировать всякий раз, когда мы добавляем новый TAG.

Положите эти файлы в ту же директорию где лежит main.lua.

Загрузка уровня

Давайте перейдем к коду и вернемся на минуту к дизайну уровня. Удалите имеющийся код в main.lua и замените следующим:

physics = require("physics")
physics.start()

display.setStatusBar( display.HiddenStatusBar )

Файл main.lua будет выполняться сверху вниз. Эти первые три строки будут выполнены первыми, когда мы запустим Corona Simulator. Давайте разберем каждую:

  1. Импортирует код физического движка и присваивает движок объекту называемый physics.
  2. Запускает физический движок с дефолтными значениями гравитации. Corona использует физический движок Box2D, так что если вы использовали его ранее многое вам будет знакомо.
  3. Скрывает статус бар.

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

Давайте попробуем. Добавьте новую функцию для загрузки уровня:

require("LevelHelperLoader")

local function loadLevel()
	localGroup = display.newGroup()
	loader = LevelHelperLoader:initWithContentOfFile("level1.plhs")
	loader:instantiateObjectsInGroup(physics, localGroup)

	worldHeight = loader:getWorldBoundariesRect().size.height
	localGroup.y = -worldHeight + 480

	player = newPlayer()
end

Первая строка загружает класс LevelHelperLoader (сгенерированный нами ранее или взятый вами из ресурсов для игры), который похож на #import в Objective-C.

Следующая строка создает функцию, которая в Lua делается с помощью ключевого слова “function”. Переменные и функции в Lua по умолчанию являются глобальными по своим масштабам. Если мы хотим уменьшить масштабы текущей функции нужно включать ключевое слово “local”.

Corona называет визуальные объекты (спрайты, нарисованные объекты, слои) “отображаемыми объектами”. Каждый из наших спрайтов, фоновые облака, игрок, платформы и т.д. являются отображаемыми объектами.

Функция в первой строке создает новую отображаемую группу, которая в функциях Corona похожа на CCLayer в Cocos2D. Мы собираемся добавить все содержимое нашего уровня к отображаемым группе.

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

В Corona нам необходимо только одно обращение/вызов (call) к LevelHelper, который создает все наши отоброжаемые объекты и создает соответствующие физическте тела. Физические тела в Corona автоматически соотносятся со своими спрайтами. Это делает создание физики в игре очень простой.

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

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

Наши отображаемые объекты сейчас на экране и часть отображаемой группы называется localGroup. Однако, localGroup в данный момент находится на “y” на позиции “0″. Система координат в Corona берет отсчет в верхнем левом углу экрана и увеличивается в направлении к низу, это означает, что мы увидим самый верх нашего уровня или самый конец.

Нам нужно двигать отображаемую группу вверх, что и делают следующие две строчки кода. Сначала мы берем размер мира (world size), который мы установили в LevelHelper’е, затем мы устанавливаем localgroup.y на величину противоположную размеру мира, двигая это все вверх с минусом в одну высоту экрана.

Наконец мы создаем и инициализируем игрока. Этот код еще не добавлен, поэтому вставьте его прямо над loadLevel:

local function newPlayer()
	local p = loader:spriteWithUniqueName("char_jump2")
	return p
end

Получаем спрайт с уникальным именем “char_jump2”, который мы добавили на уровень созданный в LevelHelper.

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

Теперь, когда у нас на месте две эти функции, давайте использовать их! Добавьте следующую строку сразу после описания функции:

loadLevel()

И это все! Сохраните main.lua, и поместите в один каталог с LevelHelperLoader.lua, cloudSprites.png, cloudSprites-hd.png, cloudSprites.pshs и level1.plhs. Затем запустите main.lua в Corona Simulator.

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

11-corona

Поздравляю, вы написали свою первую программу на Corona с главным героем и платформами!

Давайте двигаться дальше и сделаем так, чтобы игрок прыгал по облакам!

Добавляем столкновения (collision) и прыжки.

Для добавления прыжков, измените функцию newPlayer, добавив обработчик столкновений, как показано ниже:

local function newPlayer()
	local p = loader:spriteWithUniqueName("char_jump2")

	local function pCollision(self, event)
		object = event.other
		if event.phase == "began" then
			vx, vy = self:getLinearVelocity()
			if vy > 0 then
				if object.tag == LevelHelper_TAG.CLOUD then
					self:setLinearVelocity(0, -350)
				end
			end
		end
	end
	p.collision = pCollision
	p:addEventListener("collision", p)
	return p
end

Вторая строка создает нашу callback-функцию столкновения. Второй параметр содержит информацию о событии столкновения (collision event).

Self - это объект игрока, а other эти тип события. Event.other - это объект с которым столкнулся self.

Затем нам нужно, чтобы прыжок делался только один раз. Столкновение может быть неоднократным, но нам нужен единичный прыжок с одним столкновением, так что мы будем проверять это на фазе “began”.

Затем мы проверяем должны ли мы прыгать. Мы берем линейную скорость (linear velocity) игрока и проверяем чтобы она была больше 0, потому что мы хотим прыгать только на обратном пути вниз, а не когда мы пролетаем через облака.

И наконец мы смотрим с чем мы столкнемся. Нам нужно отскакивать только от белых облаков, поэтому нам нужно проверять tag объекта с которым сталкиваемся.

Если все эти условия соблюдены, мы установим линейную скорость self до -350 или вверх до 350. Мы используем зедесь setLinearVelocity (вместо applyLinearImpulse), потому что неважно какой импульс мы получили падая вниз, нам нужно чтобы обратный прыжок был одинаковой высоты.

Наконец, мы собираемся установить только что созданную функцию, чтобы был обратный вызов столкновения (collision callback) для объекта игрока. Следующие две строчки делают это. С обратным вызовом столкновения (collision callback) мы установим свойство .collision и добавим слушателя события (event listener) к объекту.

Снова откройте проект в Corona Simulator. Теперь игрок должен отскакивать от белых облаков!

12-corona

Я держу Corona Simulator открытым и использую сочетание клавиш Command-R чтобы перезагрузить проект после сохранения файла. Corona тоже обнаружит, что main.lua был обновлен и попросит вас о перезапуске.

Event Listeners (Слушатели событий) в Corona.

Сейчас самое время поговорить подробнее об event listeners в Corona.

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

Event listeners в Corona это callback-методы. Есть event listener’ы, которые обрабатывают касания и акселерометр, изменение ориентации или инпут GPS, столкновения (collision), приостановка или выход из приложения и т.д.

Существует два вида слушателей события:

События, которые касаются всех объектов. Они известны как runtime events (события времени исполнения) и включают в себя такие события как изменение ориентации или инпут (input) от GPS. Другой пример – слушатель enterFrame, который является событием, которое вызывается каждый раз при отрисовки кадра.

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

В нашем случае мы создали функцию столкновения, функцию pCollision. Мы закреприли слушателя события за игроком, так что когда игрок сталкивается с другим объектом, этот объект будет вызываться. Функция имеет два параметра – объект self, в данном случае это игрок, и объект события. Объект события создан и содержит информацию о типе события столкновения.

Разные слушатели события имеют разные объекты события, которые предоставляют разную информацию. Например, есть тип события “postCollision”, который отвечает за силу столкновения. Обычное событие столкновения не имеет такой информации.

Для получения более развернутой информации о типах событий в Corona взгляните на этот документ (англ.).

Дополнительные столкновения.

Теперь, когда белые облака работают, можно заняться синими и серыми облаками. Синие облака фактически не требуют никакого дополнительного кода. Они совместно с белыми облаками используют тег CLOUD и являются статическими телами (подразумевается, что вы должны пройти вокруг них, а не через них, как в случае с белыми облаками).

Перейдите снова к функции pCollision и добавьте код показанный ниже:

if event.phase == "began" then
	vx, vy = self:getLinearVelocity()
	if vy > 0 then
		if object.tag == LevelHelper_TAG.CLOUD then
			self:setLinearVelocity(0, -350)
		elseif object.tag == LevelHelper_TAG.BCLOUD then
			loader:removeSpriteWithUniqueName(object.uniqueName)
		end
	end
end

Если тег BCLOUD, то нужно чтобы облако (серое) исчезло, поэтому мы вызываем loader:removeSpriteWithUniqueName и передаем имя объекта с которым столкнулись. Помните, что в нашем коде “object” это переменная где мы сохранили event.other.

Создание анимации стрельбы.

Любовь витает в воздухе, а скоро полетят и стрелы.

Во-первых, давайте создадим анимацию стрельбы в LevelHelper.

Переключитесь назад в LevelHelper, выберите вкладку анимации справа и нажмите кнопку “New”, чтобы создать новую анимацию. Откроется окно “Animation Builder”. Добавьте спрайты под названием front_arm, arm_front_shoot1, arm_front_shoot2, и еще раз front_arm. Выделите указанные спрайты и нажмите кнопку “+”. Снимите галочку с “Loop Forever”. Остальные дефолтные настройки нам подходят.

13-corona

Нажмите “Create Animation” для сохранения. Переименуйте анимацию в “shoot”.

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

После того как вы перетащили ее на уровень, выделите объект анимации и установите тип физики на “No Physic”, чтобы избежать странного поведения физики, когда мы прикрепим это к игроку.

Добавляем руки.

Вернитесь к списку спрайтов. Перетащите спрайт “back_arm” за пределы уровня. Установите новую анимацию (которая называется “front_arm” потому что это первый спрайт в сете) и в “back_arm” установите “No Physic”.

14-corona

Измените код в функции newPlayer как показано ниже:

local backarm = loader:spriteWithUniqueName("back_arm")
local p = loader:spriteWithUniqueName("char_jump2")
local frontarm = loader:spriteWithUniqueName("front_arm")
loader:pauseAnimationOnSprite(frontarm)

Здесь мы просто получаем переменные для каждой части игрока. В LevelHelper’е эти вызовы метода дают нам переменные, которые мы можем использовать, чтобы обратиться к этим объектам. Объекты созданы автоматически и добавлены за уровень LevelHelper, но нам нужна пересенная, чтобы обратиться к ним.

Строка Loader:pauseAnimationOnSprite (frontarm) не дает работать анимации, когда мы запускаем игру. Мы будем вызывать анимацию каждый раз, когда необходимо стрелять, но по умолчанию, анимация запускаеся автоматически при старте игры.

Игрок будет внутри вида, а вот руки нет. Чтобы поправить это мы создадим функцию enterFrame. enterFrame срабатывает всякий раз, когда отрисовывается экран. Эта функция буде перемещать руки и лук с нашим игроком каждый кадр. Так же, это заставит игрока смотреть в направлении движения.

Добавтье следующий код в конец функции newPlayer () перед строкой “return p”:

function p:enterFrame(event)

		backarm.x = player.x
		backarm.y = player.y
		frontarm.x = player.x
		frontarm.y = player.y

		if self.x < 0 then
			self.x = 320
		end
		if self.x > 320 then
			self.x = 0
		end

		px, py = player:getLinearVelocity()
		if px < 0 then
			frontarm.xScale = -1
			backarm.xScale = -1
			self.xScale = -1
		elseif px > 0 then
			frontarm.xScale = 1
			backarm.xScale = 1
			self.xScale = 1
		end

	end

Большая часть этого когда должна быть понятна.

Мы декларируем функции с префикстом p:. Когда мы создаем слушателя enterFrame для конкретного объекта, он должен называться “enterFrame” и он чувствителен к регистру.

Последний блок записывает линейную скорость игрока в переменных px и py. Затем, мы используем эту информацию для установки свойства XScale для всех трех.

Теперь мы должны добавть слушателя события enterFrame к объекту Runtime:

Runtime:addEventListener("enterFrame", p)

Если вы все сохраните и запустите, то увидите, что игрок вооружен и опасен!
15-corona

Что дальше?

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

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (6 голосов, средний: 4.83 из 5)
Загрузка ... Загрузка ...
1 Комментарий »

Окт 09

0Это вторая часть урока на тему “Как сделать простую 2.5D игру для iPhone с помощью Unity”

В первой части мы получили базовое понимание о Unity и о написании кода на C#. Мы создали простую игру, в которой самолет летает вперед-назад, бомбит акул и защищает рыбу-клоуна.

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

Если у вас нет исходников, то скачайте и запустите проект в Unity. Ок, давайте узнаем о Unity еще больше и прокачаем нашу игрушку.

Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »

Сен 25

unitysimplegamesmall2.5D – это в целом 3D игра, но геймплей происходит в 2D плоскости. Как хорошие примеры можно отметить  Super Mario Brothers Wii, Little Big Planet, Paper Monsters. Отличный способ создать 2.5D игру (и 3D тоже) это использовать популярный, простой и доступный инструмент для разработки игр под названием Unity.

В этой серии уроков я собираюсь показать вам, как можно использовать Unity для создания простой 2.5D под названием «Shark Bomber!». Если вы новичек в Unity, то урок будет для вас особенно полезен.

Вы узнаете как сделать простую игру с нуля и уясните много нового. В этой игре вам предстоит взять под контроль небольшой (но хорошо вооружённый) самолет, который будет бомбить акул, защищая прекрасных рыб-клоунов. Unity не использует язык Objective-C, так что опыт работы с этим языком вам не потребуется. Однако общее понимание OO (Объектно-ориентировынных) языков станет несомненным плюсом – в идеале это C #, Java или ActionScript. Имейте ввиду, что этот урок для пользователей Mac, пользователи Windows могут столкнуться с некоторыми проблемами.

Кроме того, помните, что тестировать приложение мы будем на устройстве с iOS (не на симуляторе), так что убедитесь, что оно готово к работе. Итак, давайте перейдем к Unity. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (8 голосов, средний: 4.38 из 5)
Загрузка ... Загрузка ...
Комментариев: 7 »

Авг 17

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

Когда необходимо отладить большое приложение, без помощи обойтись трудно. Именно так я и поступил со своей последней игрой (Battle Map для iPad) - организовал бета-тестирование. Сегодня я хочу поделиться с вами своим опытом, рассказать, как найти бета-тестеров, раздать им копии приложения, ответить на их вопросы и многое другое.

А теперь давайте капнем поглубже бета-тестирование приложений для iOS.

Нужно ли мне бета-тестирование?

Если у вас небольшое приложение и к тому же вы хотите побыстрее его выпустить, то вероятно ответ - НЕТ. Устроить бета-тестирование не так-то просто, это отнимает много времени, сил и задерживает выпуск приложения, а соответственно и заработок на нем.

Но вы можете подумать над возможностью организацией бета-тестирования если:

  • Ваше приложение имеет много особенностей/фишек. Если у вас большое и сложное приложение с множеством функций, то это значит, что велика вероятность возникновения ошибок. Бета-тестеры могут помочь вам их обнаружить еще перед релизом.
  • Вы заботитесь о качестве приложения. Если вы делаете приложения высокого качества, бета-тестеры смогут подкинуть вам дополнительные идеи, о которых вы могли и не думать. Некоторые из них можно будет реализовать еще до ее релиза.
  • Вы делаете игру. Если вы занимаетесь разработкой игры, бета-тестеры могут быть особенно полезны, так как достаточно трудно без реальных игроков найти баланс между трудностью игры и ее развлекательной частью.

Как найти бета-тестеров?

Если вам нужно найти несколько бета-тестеров, то наилучший способ - это пройтись по тематическим форумам (прим. ред. TouchArcade.com и т.д.). Я, например, делал это на сайтах MacRumors, reddit.com и нашел нужных мне людей.

Если у вас есть аккаунт в Twitter, то это еще один неплохой источник бета-тестеров. Там обитает немало хороших разработчиков для iPhone и iPad готовых вам помочь.

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

Нужно ли мне регистрировать бета-тестеров (Beta Signup Form)?

  • Это облегчит вам задачу, если тестирование проходит в несколько раундов. Иногда может понадобиться провести тестирование в несколько этапов и регистрация тестеров в этой связи может быть полезной. Имея форму регистрации, тестеры могут зарегистрироваться в любое время, и вы сможете отправлять им приглашения/сообщения, когда это будет необходимо.
  • Это позволит задавать бета-тестерам вопросы. Когда люди подписываются на бета-тест, у вас будет возможность задать им несколько вопросов, которые могут помочь вам решить, кого стоит пригласить. Например, в моем случае, я хотел убедиться, что и Game Masters и Игроки (Players) (прим. ред. не разобрал, что имеет подразумевает автор под словами Game Masters) опробовали Battle Map перед выходом, чтобы получить обе точки зрения.
  • Это поможет вам организовать всю вашу информацию. Так как ваши бета-тестеры будут в базе данных, вы сможете отслеживать их UDID’ы, сможете узнать ответили ли они на ваши сообщения, и сможете сконцентрировать другие данные в одном месте.
  • Это позволит людям получить уведомления, когда приложение будет запущено. Людям, подписавшимся на бета-тест, интересно узнать, когда состоялся релиз. Зарегистрируйте их, чтобы дать им знать. Это простой способ распространить информацию в день запуска.

Как мне сделать форму регистрации (Beta Signup Form)?

Да! Я знал, что вы это спросите. Урок по созданию формы регистрации бета-тестеров вскоре появится на нашем блоге (нужно время на перевод этого урока). Следите за обновлениями.

Что мне делать, когда бета-тестеры найдены?

Когда добровольцы найдены, перед началом каких-либо действий, нужно чтобы они отправили вам «уникальный идентификатор» своего устройства (UDID). Тогда вы сможете отправить им копию приложения.

Ниже инструкция, которую я обычно посылаю тестерам, чтобы они выслали свой UDID:

  • Найдите в App Store бесплатное приложений - “UDID Tool”
  • Скачайте его на свой [сюда вставить название устройства]
  • Запустите приложение и нажмите Send eMail и отправьте письмо на [сюда вставьте адрес электронной почты]

Если вы не хотите заставлять тестеров ставить это приложение, то есть другой путь добыть UDID. Об этом вы узнаете в инструкции (английский язык) от Чарльза Тидсвелла (Charles Tidswel).

Как отослать тестерам свой Ad-Hoc Build (приложение)?

Если ранее вы не делали Ad-Hoc билды, то вы можете решить, что это трудно (как я однажды), но не стоит волноваться - это очень просто.

Просто выполните следующие действия:

  • Установите App ID для вашего приложения, если это не сделано и удостоверьтесь, что приложение его использует.
  • Зайдите во вкладку Devices и добавьте все UDID, которые вы получили от бета-тестеров. Имейте в виду, что вы можете добавить только 100 UDID’ов в год, так что следите за количеством своих тестеров.
  • Перейдите во вкладку Provisioning и создайте новый профиль. Выберите свой App ID и выделите все устройства, на которых будет работать приложение.
  • Во вкладке Distribution следуйте инструкциям “Building your Application with Xcode for Distribution” чтобы настроить ваш проект для использования нового профиля + чтобы создать Ad-Hoc билд.
  • Создайте проект со своей новой Ad-Hoc конфигурацией, и определите местонахождение .app, которое было создано. Теперь нам необходимо упаковать его так, чтобы бета-тестеры легко его установили:
  • Создайте папку и назовите ее “Payload
  • Скопируйте свое приложение в папку “Payload
  • Заархивируйте папку “Payload
  • Меняем получившиеся расширение .zip на .ipa. То есть, если у вас получилось “MyApp.zip“, то нужно сделать “MyApp.ipa“.
  • Возьмите файл .ipa и .mobileprovision и “зазипуйте” их оба в один файл.

Все готово! Теперь нужно взять и отправить получившейся .zip бета-тестерам, чтобы они смогли установить приложение.

Как бета-тестерам установить приложение?

Когда я отправляю тестерам .zip и .mobileprovision я так же передаю им следующие инструкции:

  • Скачайте архив [здесь вставить ссылку на архив]
  • Разархивируйте архив. В нем должно быть два файла - файл с расширением .ipa и .mobileprovision.
  • Перетащите файлы .ipa и .mobileprovision во вкладку Applications в iTunes, если вы на Windows или на иконку iTunes, если вы на Mac’е.
  • В iTunes выберите нужное устройство и откройте вкладку Applications. Начните синхронизацию и новое приложение должно появиться на устройстве.
  • Попробуйте запустить приложение.

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

Как организовать обратную связь с тестерами?

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

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

Вот примерный перечень:

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

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

Что мне делать с поступившей информацией?

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

Все это - ценная информация и первое что вы должны сделать, это упорядочить этот материал. Мне нравится использовать для этого сервис Evernote.

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

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

На какое количество откликов я могу рассчитывать?

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

  • Было 45 регистраций
  • Я разослал 16 приглашений
  • Из них 12 прислали мне UDID’ы
  • От 9-ти я получил отклики/советы

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

Заключение.

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

Стоит ли все это затраченных времени и усилий? Это спорный вопрос и я думаю, все зависит от конкретного приложения.

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (6 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 7 »

Авг 15

Постигать азы программирования для iPhone, iPod Touch и iPad можно и нужно с помощью наших многочисленных уроков, однако не стоит недооценивать опыт, который можно извлечь, изучая код уже готовых и работающих приложений. Именно поэтому я предлагаю вашему вниманию подборку «open source» приложений (приложения для iPhone, iPod Touch и iPad с открытым кодом). Ковыряйте на здоровье.

  1. ABC 123 - Игра на память. Используется Cocos2D (наши уроки по Cocos2D). Скачать код /App Store
  2. Artifice - Стратегия.  Убираем ящики со своего пути. Используется Cocos2D. Скачать код / App Store
  3. Colloquy - Порт одного из самых популярных IRC клиентов для Mac. Скачать код / App Store
  4. Countitout - Приложения для организации различных подсчетов. Скачать код / App Store
  5. Diceshaker - Простой симулятор игральных костей. Можно использовать для настольных игр и т.п. Скачать код / App Store
  6. Doom Classic - Классический Doom. Скачать код / App Store / Build Instructions
  7. Ecological Footprint - Приложение подсчитывает, показывает и сохраняет разную экологическую информацию. Скачать код / App Store
  8. Fosdem - Календарь для “open source” конференций Fosdem. Скачать код
  9. Freshbooks - Приложение, которое позволяет использовать програмное обеспечение Freshbooks на вашем iPhone. Скачать код / App Store
  10. Gorillas - Игра по типу Worms и iShoot. Пошаговая стратегия. Используется Cocos2D. Скачать код / App Store
  11. Go Go Lotto - Генератор лотерейных билетов. Скачать код / App Store
  12. iStrobe - Превращает вспышку iPhone 4 в фонарик с множеством настроек. Скачать код / App Store
  13. Last.fm - Приложение позволяющее использовать платформу Last.fm. Скачать код / App Store
  14. Mobylesynth - Монофонический синтезатор. Скачать код / App Store
  15. Molecules - Приложение позволяет изучать молекулы выполненные в 3D. Скачать код / App Store
  16. Mover - Приложение позволяет передавать контент с одного iPhone на другой через Wi-Fi или Bluetooth (Видео-демонстрация). Скачать код / App Store
  17. Natsulion - Twitter клиент. Скачать код / App Store
  18. NowPlaying - Приложение позволяет получить информацию о местных театрах. Скачать код / App Store
  19. Packlog - Клиент для Backpack. Скачать код / App Store
  20. PlainNote - Простой блокнот. Скачать код / App Store
  21. PocketFlix - Приложение позволяет искать фильмы и управлять вашим аккаунтом в Netflix. Скачать код / App Store
  22. NevoChess - игра Xianggi. Скачать код / App Store
  23. reMail - eMail клиент. Был исключен из AppStore, однако, исходники доступны. Скачать код
  24. RoboFindsKitten - Порт знаменитой игры написанной на ASCII. Скачать код / App Store
  25. Sci-15 HPCalc - Калькулятор. Скачать код / App Store
  26. SpaceBubbler - Космическая игра с использованием графического ядра и акселерометра. Скачать код / App Store
  27. Star3Map - Дополнительная реальность. Скачать код / App Store
  28. Task Coach - Персональный To-do ежедневник. Скачать код / App Store
  29. Tubestatus - Расписание поездов Лондона. Скачать код / App Store
  30. Tweejump - Игры. Нужно прыгать по платформам. Используется Cocos2D. Скачать код / App Store
  31. Tweetee - Улучшенная версия Natsulion Twitter Client. Скачать код / App Store
  32. Tweetero - Twitter клиент с функцией загрузки изображений. Скачать код / App Store
  33. Twitterfon - Быстрый Twitter клиент с интуитивным интерфейсом. Скачать код / App Store
  34. ViralFire - Игрушка в которой нужно уклоняться от клеток крови. Скачать код / App Store
  35. Wikihow -  Ридер популярного сайта WikiHow.com. Скачать код / App Store
  36. Wolfenstein 3D Classic Platinum - Тот самый классический Wolfenstein. Скачать код / App Store
  37. WordPress - Клиент для работы с WordPress. Скачать код / App Store
  38. YourRights - Карманная база данных ваших законных прав. Скачать код / App Store
  39. ZBar - Сканер штрих кодов. Скачать код / App Store

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

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (10 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 3 »

Янв 02

Как только из Apple пришли новости о том, что с выходом прошивки 3.0 появится возможность организовать продажу дополнительного контента непосредственно из приложения (in-app purchase) я сразу решил, что задействую эту возможность в своей программе Flower Garden. Сама идея in-app purchase хорошо вписывается в идею цветочного магазина, где виртуальные садоводы могут купить дополнительные предметы для своего сада, поэтому вопрос стоял лишь во времени, которое потребуется на реализацию. По своему личному опыту я знал, что лишь малая часть пользователей, которые однажды купили приложения, тратят деньги и на дополнительный контент. Мое приложение Flower Garden очень хорошо приняли как игроки, так и новостные сайты, однако бестселлером игра никогда не была, а значит и покупки по системе in-app purchase с самого начала предполагались небольшими.

Ситуация поменялась когда Apple позволили встраивать in-app purchase в бесплатные приложения, а Flower Garden как раз был бесплатен, поэтому аудитория пользователей удвоилась.

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

Сказав это, я дал себе неделю, чтобы полностью реализовать задуманное. В этот срок необходимо было произвести изменения в приложении, используя StoreKit, написать код и собственно создать новый контент для продажи. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (12 голосов, средний: 4.92 из 5)
Загрузка ... Загрузка ...
1 Комментарий »

Дек 21

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

alert1

Настройка горизонтальной ориентации экрана.

В своем приложении я все настроил следующим образом (файл info.plist):

infoplist Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...
Нет комментариев »
\\ tags:

Авг 30

Одно из самых приятных нововведений в iPhone 3GS — более быстрая и мощная графическая платформа с поддержкой OpenGL ES 2.0. К сожалению, информации от Apple о том, как именно задействовать открывшиеся возможности, крайне мало. Практически для всех API у них есть отличная документация с образцами кодов, но проблема в том, что в случае с OpenGL примеры всегда оставляли, мягко говоря, желать лучшего.

Более того, начинающим работу с OpenGL ES 2.0 не предлагается ни базовых примеров, ни шаблона XCode. Чтобы воспользоваться расширенными графическими возможностями, придется осваивать их самостоятельно. Не стоит ошибочно полагать, что OpenGL ES 2.0 — незначительно доработанная версия OpenGL ES 1.1 с парочкой новых функций. Отличия между ними кардинальные! Конвейер с фиксированными функциями исчез, и теперь для отображения на экране обычного треугольника понадобится более глубокое знакомство с основами компьютерной графики, включая шейдеры.

Учитывая полное отсутствие документации, я решил создать самое простое приложение на iPhone с помощью OpenGL ES 2.0. Для пользователей оно вполне может стать отправной точкой при создании приложений. В качестве вариантов я рассматривал вращающийся чайник и прочие конструкции, но в итоге решил не вдаваться в детали по загрузке модели, а просто обновить приложение OpenGL ES 1.1, являющееся частью шаблона XCode. Полный итоговый код можно загрузить здесь. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (6 голосов, средний: 4.67 из 5)
Загрузка ... Загрузка ...
Комментариев: 2 »

Авг 26

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

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

1. Для начала создайте приложение типа “Window based” и присвойте проекту имя “MapApp“.
2. Добавьте к проекту фреймворк “MapKit“. (Удерживая нажатой клавишу , щелкните на папке “Frameworks” и выполните “Add -> Existing Frameworks“.)
3. Создайте новый класс контроллера представления и назовите его “MapViewController“. Добавьте текстовое поле, кнопку и представление карты. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 3 »

Авг 17

Представленный в iPhone SDK фреймворк “AVFoundation” включает “AVAudioPlayer” — простое многофункциональное решение для воспроизведения аудиофайлов на базе Objective-C.

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

Источник/Github

Код к уроку можно получить на GitHub: клонируйте его из репозитория или загрузите zip-архив. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 7 »