Это вторая часть нашего учебного пособия Corona SDK Frogger Inspired. В сегодняшнем уроке мы добавим интерфейс и взаимодействие с игрой. Читай дальше!
Где мы остановились. , ,
Обязательно ознакомьтесь с первой частью серии « Создание интерфейса» , чтобы полностью понять и подготовиться к этому уроку.
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. Показать кредиты
Экран кредитов отображается, когда пользователь нажимает кнопку О программе ; прослушиватель касаний добавляется в представление кредитов, чтобы удалить его.
1
2
3
4
5
6
7
8
9
|
function showCredits:tap(e)
playBtn.isVisible = false
creditsBtn.isVisible = false
creditsView = display.newImage(‘credits.png’, 0, display.contentHeight)
lastY = title.y
transition.to(title, {time = 300, y = -20})
transition.to(creditsView, {time = 300, y = 265, 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(title, {time = 300, y = lastY});
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
|
— Game Background
gameBg = display.newImage(‘gameBg.png’)
|
6. Добавить автомобили
Следующие строки кода определяют размещение автомобилей на сцене. Каждая строка представляет автомобиль, его положение, изображение, поворот, направление и название. Мы создадим эту функцию позже в этом уроке.
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
26
27
28
29
30
31
32
|
— Cars Part 1
obstacles = display.newGroup()
addObstacle(184, 353, ‘car2’, false, ‘l’, ‘car’)
addObstacle(184, 326, ‘car’, true, ‘r’, ‘car’)
addObstacle(124, 293, ‘car2’, false, ‘l’, ‘car’)
addObstacle(94, 386, ‘car’, true, ‘r’, ‘car’)
addObstacle(64, 326, ‘car’, true, ‘r’, ‘car’)
addObstacle(94, 293, ‘car2’, false, ‘l’, ‘car’)
addObstacle(34, 386, ‘car’, true, ‘r’, ‘car’)
addObstacle(4, 353, ‘car2’, false, ‘l’, ‘car’)
addObstacle(4, 293, ‘car2’, false, ‘l’, ‘car’)
addObstacle(274, 386, ‘car’, true, ‘r’, ‘car’)
addObstacle(234, 353, ‘car2’, false, ‘l’, ‘car’)
addObstacle(274, 326, ‘car’, true, ‘r’, ‘car’)
— Cars Part 2
addObstacle(94, 226, ‘car’, true, ‘r’, ‘car’)
addObstacle(94, 197, ‘car2’, false, ‘l’, ‘car’)
addObstacle(94, 167, ‘car’, true, ‘r’, ‘car’)
addObstacle(94, 137, ‘car2’, false, ‘l’, ‘car’)
addObstacle(94, 107, ‘car’, true, ‘r’, ‘car’)
addObstacle(274, 197, ‘car2’, false, ‘l’, ‘car’)
addObstacle(94, 107, ‘car’, true, ‘r’, ‘car’)
addObstacle(34, 226, ‘car’, true, ‘r’, ‘car’)
addObstacle(34, 197, ‘car2’, false, ‘l’, ‘car’)
addObstacle(184, 167, ‘car’, true, ‘r’, ‘car’)
addObstacle(184, 137, ‘car2’, false, ‘l’, ‘car’)
addObstacle(4, 107, ‘car’, true, ‘r’, ‘car’)
addObstacle(274, 197, ‘car2’, false, ‘l’, ‘car’)
addObstacle(274, 107, ‘car’, true, ‘r’, ‘car’)
|
7. Добавить Pad
Падение добавлено к сцене, чтобы управлять лягушкой.
01
02
03
04
05
06
07
08
09
10
11
|
— Pad
up = display.newImage(‘up.png’, 33.5, 369.5)
left = display.newImage(‘left.png’, 0, 402.5)
down = display.newImage(‘down.png’, 33.5, 436.5)
right = display.newImage(‘right.png’, 66.5, 402.5)
up.name = ‘up’
down.name = ‘down’
left.name = ‘left’
right.name = ‘right’
|
8. Лягушка
Далее мы добавляем нашего игрока на сцену.
1
2
3
|
— Frog
frog = display.newImage(‘frog.png’, 148.5, 417.5)
|
9. Цели
Прямоугольники нарисованы на сцене, чтобы представлять цели. Они будут добавлены позже в физический движок и скрыты.
1
2
3
4
5
6
7
8
|
— Goals
local g1 = display.newRect(68, 70, 15, 15)
g1.name = ‘goal’
local g2 = display.newRect(153, 70, 15, 15)
g2.name = ‘goal’
local g3 = display.newRect(238, 70, 15, 15)
g3.name = ‘goal’
|
10. Физика
Нам понадобится физика для обработки столкновений. Эта часть кода заботится об этом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
— Physics
physics.addBody(frog)
frog.isSensor = true
physics.addBody(g1, ‘static’)
g1.isSensor = true
g1.isVisible = false
physics.addBody(g2, ‘static’)
g2.isSensor = true
g2.isVisible = false
physics.addBody(g3, ‘static’)
g3.isSensor = true
g3.isVisible = false
gameListeners(‘add’)
end
|
11. Игровые слушатели
Эта функция добавляет необходимых слушателей для запуска игровой логики.
1
|
function gameListeners(action) if(action == ‘add’) then Runtime:addEventListener(‘enterFrame’, update) up:addEventListener(‘tap’, movePlayer) left:addEventListener(‘tap’, movePlayer) down:addEventListener(‘tap’, movePlayer) right:addEventListener(‘tap’, movePlayer) frog:addEventListener(‘collision’, onCollision) else Runtime:removeEventListener(‘enterFrame’, update) up:removeEventListener(‘tap’, movePlayer) left:removeEventListener(‘tap’, movePlayer) down:removeEventListener(‘tap’, movePlayer) right:removeEventListener(‘tap’, movePlayer) frog:removeEventListener(‘collision’, onCollision) end end
|
12. Добавить функцию препятствий
Следующая функция создает препятствие на основе своих параметров. Он создает физический объект графика и добавляет его в группу.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
function addObstacle(X, Y, graphic, inverted, dir, name)
local c = display.newImage(graphic .. ‘.png’, X, Y)
c.dir = dir
c.name = name
—Rotate graphic if going right
if(inverted) then
c.xScale = -1
end
— Physics
physics.addBody(c, ‘static’)
c.isSensor = true
obstacles:insert(c)
end
|
13. Переместить игрока
Нажатие кнопок на пэде вызовет эту функцию. Он переместит игрока на тридцать один пиксель в нажатом направлении.
01
02
03
04
05
06
07
08
09
10
11
12
|
function movePlayer(e)
audio.play(moveSnd)
if(e.target.name == ‘up’) then
frog.y = frog.y — 31
elseif(e.target.name == ‘left’) then
frog.x = frog.x — 31
elseif(e.target.name == ‘down’) then
frog.y = frog.y + 31
elseif(e.target.name == ‘right’) then
frog.x = frog.x + 31
end
end
|
14. Функция обновления
Функция обновления, которая запускает каждый кадр. Он отвечает за перемещение автомобилей через сцену и восстановление их положения.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
function update()
— Move Obstacles
for i = 1, obstacles.numChildren do
if(obstacles[i].dir == ‘l’) then
obstacles[i].x = obstacles[i].x — 1
else
obstacles[i].x = obstacles[i].x + 1
end
— Respawn obstacle when out of stage
—Right
if(obstacles[i].dir == ‘r’ and obstacles[i].x > display.contentWidth + (obstacles[i].width * 0.5)) then
obstacles[i].x = -(obstacles[i].width * 0.5)
end
— Respawn obstacle when out of stage
—Left
if(obstacles[i].dir == ‘l’ and obstacles[i].x < -(obstacles[i].width * 0.5)) then
obstacles[i].x = display.contentWidth + (obstacles[i].width * 0.5)
end
end
end
|
15. Столкновения
Наконец, мы проверяем на столкновения. Если автомобиль сбил лягушку, графика удаляется, и отображается сообщение « Вы проиграли» . Когда три лягушки достигнут своей цели, появится сообщение You Win , заканчивающее игру.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
function onCollision(e)
if(e.other.name == ‘car’) then
display.remove(e.target)
audio.play(loseSnd)
alert(‘lose’)
elseif(e.other.name == ‘goal’) then
display.remove(e.other)
local f = display.newImage(‘frog.png’, e.other.x — 12, e.other.y — 18)
audio.play(goalSnd)
timer.performWithDelay(10, function() frog.x = 160 frog.y = 426 end, 1)
counter = counter + 1
end
—check if goals complete
if(counter == 3) then
alert()
end
end
|
16. Оповещение
Функция оповещения создает представление оповещения, оживляет его и завершает игру.
01
02
03
04
05
06
07
08
09
10
11
|
function alert(action)
gameListeners(‘rmv’)
display.remove(obstacles)
if(action == ‘lose’) then
alertView = display.newImage(‘lose.png’, 127.5, 345)
else
alertView = display.newImage(‘win.png’, 132, 345)
end
transition.from(alertView, {time = 200, alpha = 0.1})
end
|
17. Вызов основной функции
Чтобы начать игру, необходимо вызвать функцию Main . С помощью приведенного выше кода мы сделаем это здесь:
1
|
Main()
|
18. Экран загрузки
Файл Default.png — это изображение, которое будет отображаться, пока iOS загружает основные данные для отображения главного экрана . Добавьте это изображение в исходную папку вашего проекта; он будет автоматически добавлен компилятором Corona.
19. Иконка
Используя графику, которую вы создали ранее, теперь вы можете создать красивый и красивый значок. Размер значка для iPhone без изображения Retina составляет 57x57px, но версия Retina составляет 114x114px, а для магазина iTunes требуется версия 512x512px. Я предлагаю сначала создать версию 512x512px, а затем уменьшить ее для других размеров. Это не должно иметь закругленные углы или прозрачные блики; iTunes и iPhone сделают это за вас.
20. Тестирование в симуляторе
Пришло время сделать финальный тест. Откройте Corona Simulator, перейдите в папку вашего проекта и нажмите «Открыть». Если все работает, как ожидалось, вы готовы к последнему шагу!
21. Сборка
В Corona Simulator перейдите в File> Build и выберите ваше целевое устройство. Заполните необходимые данные и нажмите Build . Подождите несколько секунд, и ваше приложение будет готово для тестирования устройства и / или отправки для распространения!
Вывод
В этой серии мы узнали о перемещении объекта с помощью экранной клавиатуры и обнаружении столкновений с использованием физического движка — навыки, которые могут быть действительно полезны в широком спектре игр. Поэкспериментируйте с конечным результатом и попробуйте создать собственную версию игры! Надеюсь, вам понравился этот урок, и вы нашли его полезным. Спасибо за чтение!