Это вторая часть нашего учебного пособия по Corona SDK Hundreds. В сегодняшнем уроке мы добавим интерфейс и взаимодействие с игрой. Читай дальше!
Где мы остановились. , ,
Пожалуйста , ознакомьтесь с первой частью серии, чтобы полностью понять и подготовиться к этому уроку.
Шаг 1. Слушатели кнопки «Пуск»
Эта функция добавляет необходимых слушателей к кнопкам TitleView .
1
2
3
4
5
6
7
8
9
|
function startButtonListeners(action)
if(action == ‘add’) then
playBtn:addEventListener(‘tap’, showGameView)
creditsBtn:addEventListener(‘tap’, showCredits)
else
playBtn:removeEventListener(‘tap’, showGameView)
creditsBtn:removeEventListener(‘tap’, showCredits)
end
end
|
Шаг 2: Показать кредиты
Экран кредитов отображается, когда пользователь нажимает кнопку «о», к представлению кредитов добавляется прослушиватель касаний, чтобы удалить его.
01
02
03
04
05
06
07
08
09
10
|
function showCredits:tap(e)
playBtn.isVisible = false
creditsBtn.isVisible = false
creditsView = display.newImage(‘credits.png’, 0, display.contentHeight)
lastY = titleBg.y
lastX = titleBg.x
transition.to(titleBg, {time = 300, y = (display.contentHeight * 0.5) — (titleBg.height + 20), x = (display.contentWidth * 0.5) — (titleBg.width * 0.5) — 10})
transition.to(creditsView, {time = 300, y = (display.contentHeight * 0.5) + 35, onComplete = function() creditsView:addEventListener(‘tap’, hideCredits) end})
end
|
Шаг 3: Скрыть кредиты
При нажатии на экран кредитов, он будет отключен со сцены и удален.
1
2
3
4
|
function hideCredits:tap(e)
transition.to(creditsView, {time = 300, y = display.contentHeight + 25, onComplete = function() creditsBtn.isVisible = true playBtn.isVisible = true creditsView:removeEventListener(‘tap’, hideCredits) display.remove(creditsView) creditsView = nil end})
transition.to(titleBg, {time = 300, y = lastY, x = lastX});
end
|
Шаг 4: Показать игровой вид
При нажатии кнопки « Пуск» вид заголовка изменяется и удаляется, открывая вид игры. В этом представлении участвует много частей, поэтому мы разделим их на следующих шагах.
1
2
|
function showGameView:tap(e)
transition.to(titleView, {time = 300, x = -titleView.height, onComplete = function() startButtonListeners(‘rmv’) display.remove(titleView) titleView = nil end})
|
Шаг 5: Фон игры
Этот код размещает фоновое изображение игры на сцене.
1
2
3
4
|
— Game Background
display.remove(bg)
gameBg = display.newImage(‘gameBg.png’)
|
Шаг 6: Стены
Далее мы добавляем стены на сцену. Они созданы с использованием API рисования.
1
2
3
4
5
6
|
— Walls
left = display.newLine(0, 240, 0, 720)
right = display.newLine(320, 240, 320, 720)
top = display.newLine(160, 0, 480, 0)
bottom = display.newLine(160, 480, 480, 480)
|
Шаг 7: Круги
Эта часть создает пять кругов на экране в произвольной позиции, переменная i используется для умножения константы, которая будет определять цвет кругов, делая его светлее каждый раз. Текстовое поле также создается, и оба содержатся в группе, чтобы переместить их вместе.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
— Circles
circles = display.newGroup()
local color = 0
for i = 1, 5 do
local rx = 21 + math.floor(math.random() * (display.contentWidth — 42))
local ry = 21 + math.floor(math.random() * (display.contentHeight — 42))
local cg = display.newCircle(rx, ry, 21)
local label = display.newText(‘0’,cg.x-4.2, cg.y-12.2, native.systemFontBold, 13)
cg.fillColor = color + (i*40)
cg:setFillColor(cg.fillColor)
local c = display.newGroup(cg, label)
c.pressed = false
c.name = ‘c’
c.radius = 21
|
Шаг 8: Физика круга
Здесь мы добавляем физику в наш новый круг.
1
2
3
4
5
6
7
|
— Circle Physics
physics.addBody(c, ‘dynamic’, {radius = 21, bounce = 1})
c:setLinearVelocity(100, 100)
circles:insert(c)
end
|
Шаг 9: Физика стен
И сделать то же самое с нашими стенами.
1
2
3
4
5
6
|
— Walls Physics
physics.addBody(left, ‘static’)
physics.addBody(right, ‘static’)
physics.addBody(top, ‘static’)
physics.addBody(bottom, ‘static’)
|
Шаг 10: Оценка TextField
Теперь мы добавляем текстовые поля оценки.
1
2
3
4
5
6
7
8
9
|
— Score TextField
score = display.newText(‘0’, 257, 4, native.systemFont, 15)
score:setTextColor(150, 150, 150)
local total = display.newText(‘ / 100’, 267, 4, native.systemFont, 15)
total:setTextColor(150, 150, 150)
gameListeners(‘add’)
end
|
Шаг 11: Слушатели игр
Эта функция добавляет необходимых слушателей для запуска игровой логики.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
function gameListeners(action)
if(action == ‘add’) then
for i = 1, 5 do
circles[i]:addEventListener(‘touch’, onTouch)
circles[i]:addEventListener(‘collision’, onCollision)
end
else
for i = 1, 5 do
circles[i]:removeEventListener(‘touch’, onTouch)
circles[i]:removeEventListener(‘collision’, onCollision)
end
end
end
|
Шаг 12: Увеличьте счет
Этот код запускается при касании круга.
Сначала мы увеличиваем счет.
1
2
3
4
5
6
7
|
function onTouch(e)
if(e.phase == ‘began’) then
e.target.pressed = true
— Increase Counter
score.text = tostring(tonumber(score.text) + 2)
|
Шаг 13: Увеличить размер
Тогда размер круга. Круг будет расти, когда палец на нем больше не будет.
1
2
3
|
— Increase size
e.target.radius = e.target.radius + 2
|
Шаг 14: измени цвет
Меняет цвет с черного / серого на красный.
1
2
3
|
— Change Color
e.target[1]:setFillColor(224, 11, 0)
|
Шаг 15: Обновить круг
Мы воссоздаем круг и его свойства по окончании события касания.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
if(e.phase == ‘ended’) then
e.target.pressed = false
— Update physics
local number = tostring(tonumber(e.target[2].text)+2)
local r = e.target.radius
local cg = display.newCircle(e.target.x, e.target.y, r)
local label = display.newText(number ,cg.x-4.2, cg.y-12.2, native.systemFontBold, 13)
cg:setFillColor(e.target[1].fillColor)
cg.fillColor = e.target[1].fillColor
local c = display.newGroup(cg, label)
c.pressed = false
c.name = ‘c’
c.radius = r
circles:remove(e.target)
physics.addBody(c, ‘dynamic’, {radius = r, bounce = 1})
c:setLinearVelocity(100, 100)
c:addEventListener(‘touch’, onTouch)
c:addEventListener(‘collision’, onCollision)
circles:insert(c)
— Move Textfield when number is 2 digit
if(tonumber(number) > 9) then
label.x = label.x — 5
end
|
Шаг 16: Уровень завершен
Здесь мы проверяем, достигло ли счет 100 баллов, и вызываем предупреждение о победе, если оно истинно.
1
2
3
4
5
6
7
8
|
— Check if score has reached 100
if(tonumber(score.text) >= 100) then
local bg = display.newImage(‘gameBg.png’)
transition.from(bg, {time = 500, alpha = 0, onComplete = alert(‘win’)})
end
end
end
|
Шаг 17: Столкновения
Игра проигрывается, когда нажатый круг сталкивается с другим. Слушатели удаляются и вызывается потерянное оповещение.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
function onCollision(e)
if(e.target.pressed and e.other.name == ‘c’) then
— Wait 0.1 seconds to stop physics
timer.performWithDelay(100, function() physics.stop() end, 1)
local r = e.target.radius
local c = display.newCircle(e.target.x, e.target.y, r)
c:setFillColor(224, 11, 0)
gameListeners(‘rmv’)
transition.to(c, {time = 700, xScale = 25, yScale = 25, onComplete = alert(‘lost’)})
end
end
|
Шаг 18: Оповещение
Функция оповещения отображает сообщение в соответствии с типом вызванного оповещения.
1
2
3
4
5
6
7
8
9
|
function alert(action)
if(action == ‘win’) then
local alertView = display.newImage(‘won.png’, 10, display.contentHeight * 0.5 — 41)
transition.from(alertView, {time = 300, y = -82, delay = 500})
else
local alertView = display.newImage(‘lost.png’, 10, display.contentHeight * 0.5 — 41)
transition.from(alertView, {time = 300, y = -82, delay = 500})
end
end
|
Шаг 19: вызов основной функции
Чтобы начать игру, необходимо вызвать функцию Main . С помощью приведенного выше кода мы сделаем это здесь:
1
|
Main()
|
Шаг 20: Экран загрузки
Файл Default.png — это изображение, которое будет отображаться сразу после запуска приложения, пока iOS загружает основные данные для отображения главного экрана. Добавьте это изображение в исходную папку вашего проекта, оно будет автоматически добавлено компилятором Corona.
Шаг 21: Иконка
Используя графику, созданную ранее, теперь вы можете создать красивый и красивый значок. Размер значка для iPhone без использования сетчатки составляет 57x57px, но для версии с сетчаткой — 114x114px, а для магазина iTunes требуется версия 512x512px. Я предлагаю сначала создать версию 512×512, а затем уменьшить ее для других размеров.
Для этого не нужно иметь закругленные углы или прозрачные блики, iTunes и iPhone сделают это за вас.
Шаг 22: Тестирование в симуляторе
Пришло время сделать финальный тест. Откройте Corona Simulator, перейдите в папку вашего проекта и нажмите «Открыть». Если все работает, как ожидалось, вы готовы к последнему шагу!
Шаг 23: Сборка
В симуляторе Corona зайдите в File> Build и выберите ваше целевое устройство. Заполните необходимые данные и нажмите кнопку « Создать» . Подождите несколько секунд, и ваше приложение будет готово для тестирования устройства и / или отправки для распространения!
Вывод
Поэкспериментируйте с конечным результатом и попробуйте сделать свою собственную версию игры!
Надеюсь, вам понравился этот урок, и вы нашли его полезным. Спасибо за чтение!