Статьи

Создать игру Lunar Lander Inspired — Добавление взаимодействия

Это вторая часть нашего учебного пособия по Corona SDK Lunar Lander. В сегодняшнем уроке мы добавим интерфейс и взаимодействие с игрой. Читай дальше!


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


Эта функция добавляет необходимых слушателей к кнопкам TitleView :

1
2
3
4
5
6
7
8
9
function startButtonListeners(action)
    if(action == ‘add’) then
        titleBg:addEventListener(‘tap’, showGameView)
        creditsBtn:addEventListener(‘tap’, showCredits)
    else
        titleBg:removeEventListener(‘tap’, showGameView)
        creditsBtn:removeEventListener(‘tap’, showCredits)
    end
end

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

1
2
3
4
5
function showCredits:tap(e)
    creditsBtn.isVisible = false
    creditsView = display.newImage(‘credits.png’, -130, display.contentHeight-140)
    transition.to(creditsView, {time = 300, x = 65, onComplete = function() creditsView:addEventListener(‘tap’, hideCredits) end})
end

При нажатии на экран кредитов, он будет отключен со сцены и удален.

1
2
3
4
function hideCredits:tap(e)
    creditsBtn.isVisible = true
    transition.to(creditsView, {time = 300, y = display.contentHeight+creditsView.height, onComplete = function() creditsView:removeEventListener(‘tap’, hideCredits) display.remove(creditsView) creditsView = nil end})
end

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

1
2
function showGameView:tap(e)
    transition.to(titleView, {time = 300, x = -titleView.height, onComplete = function() startButtonListeners(‘rmv’) display.remove(titleView) titleView = nil end})

Этот код размещает луны на сцене.

1
2
3
4
5
6
7
8
9
— Moons
     
m1 = display.newImage(‘moon.png’, 386, 156)
m2 = display.newImage(‘moon.png’, 252, 99)
m3 = display.newImage(‘moon.png’, 131, 174)
     
m1.name = ‘moon’
m2.name = ‘moon’
m3.name = ‘moon’

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

1
2
3
4
— Big Moon
     
bigM = display.newImage(‘moonBig.png’, 10, 53)
bigM.name = ‘moon’

Место посадки представлено стрелкой. Свойство name создается, чтобы помочь идентифицировать эти элементы при столкновении.

1
2
3
4
— Arrow
     
arrow = display.newImage(‘arrow.png’, 44, 24)
arrow.name = ‘goal’

Далее добавляем ракету. Это будет наш контролируемый пользователем элемент.

1
2
3
— Rocket
     
rocket = display.newImage(‘rocket.png’, 409.5, 114)

Следующий код поместит звезды на экран:

01
02
03
04
05
06
07
08
09
10
11
— Stars
     
s1 = display.newImage(‘star.png’, 341, 146)
s2 = display.newImage(‘star.png’, 273, 48)
s3 = display.newImage(‘star.png’, 190, 234)
s4 = display.newImage(‘star.png’, 37, 135)
     
s1.name = ‘star’
s2.name = ‘star’
s3.name = ‘star’
s4.name = ‘star’

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

01
02
03
04
05
06
07
08
09
10
11
12
— Controls
 
up = display.newImage(‘dirBtn.png’, 404, 246)
left = display.newImage(‘dirBtn.png’, 10, 246)
right = display.newImage(‘dirBtn.png’, 84, 246)
 
up.name = ‘up’
left.name = ‘left’
right.name = ‘right’
 
up.rotation = 90
right.rotation = 180

Здесь мы добавляем физику к графическим элементам.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
— Add Physics
     
physics.addBody(m1, ‘static’, {radius = 35})
physics.addBody(m2, ‘static’, {radius = 35})
physics.addBody(m3, ‘static’, {radius = 35})
     
physics.addBody(bigM, ‘static’, {radius = 40})
physics.addBody(arrow, ‘static’)
     
physics.addBody(rocket, ‘dynamic’)
rocket.isFixedRotation = true
rocket.isAwake = false —prevents initial explosion sound
     
physics.addBody(s1, ‘static’, {radius = 12})
physics.addBody(s2, ‘static’, {radius = 12})
physics.addBody(s3, ‘static’, {radius = 12})
physics.addBody(s4, ‘static’, {radius = 12})
     
arrow.isSensor = true
s1.isSensor = true
s2.isSensor = true
s3.isSensor = true
s4.isSensor = true

Эта функция добавляет необходимых слушателей для запуска игровой логики.

1
2
3
4
5
6
7
function gameListeners()
    up:addEventListener(‘touch’, movePlayer)
    left:addEventListener(‘touch’, movePlayer)
    right:addEventListener(‘touch’, movePlayer)
    Runtime:addEventListener(‘enterFrame’, update)
    rocket:addEventListener(‘collision’, onCollision)
end

Переменная направления изменяется этой функцией, это заставит ракету двигаться в нажатом направлении.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
function movePlayer(e)
    if(e.phase == ‘began’ and e.target.name == ‘up’) then
        dir = ‘up’
    elseif(e.phase == ‘ended’ and e.target.name == ‘up’) then
        dir = ‘none’
    elseif(e.phase == ‘began’ and e.target.name == ‘left’) then
        dir = ‘left’
    elseif(e.phase == ‘began’ and e.target.name == ‘right’) then
        dir = ‘right’
    elseif(e.phase == ‘ended’ and e.target.name == ‘left’) then
        dir = ‘none’
    elseif(e.phase == ‘ended’ and e.target.name == ‘right’) then
        dir = ‘none’
    end
end

Эти линии перемещают ракету в соответствии с направлением, заданным функцией movePlayer, созданной на шаге 13.

01
02
03
04
05
06
07
08
09
10
function update(e)
    — Rocket Movement
     
    if(dir == ‘up’) then
        rocket:setLinearVelocity(0, -80)
    elseif(dir == ‘left’) then
            rocket:setLinearVelocity(-100, 0)
    elseif(dir == ‘right’) then
            rocket:setLinearVelocity(100, 0)
    end

Следующий код прослушивает переменную, установленную в true, когда происходит столкновение между ракетой и луной, значение переменной изменяется функцией onCollision, которая будет создана позже.

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

1
2
3
4
5
6
7
8
— Rocket-Moon Collision
     
if(hitMoon) then
    rocket.x = 421.5
    rocket.y = 134
    hitMoon = false
    rocket.isAwake = false
end

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

1
2
3
4
5
6
7
— Rocket-Star Collision
     
if(hitStar) then
    display.remove(starHit)
    stars = stars + 1
    hitStar = false
end

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

01
02
03
04
05
06
07
08
09
10
11
12
13
— Goal
     
if(hitGoal and stars == 4) then
    rocket.x = 52
    rocket.y = 35
    physics.stop()
    display.remove(arrow)
    audio.play(goal)
    hitGoal = false
    complete = display.newImage(‘complete.png’)
elseif(hitGoal and stars ~= 4) then
    hitGoal = false
end

Эта функция запускается, когда ракета сталкивается с другим телом. Затем проверяется имя тела для выполнения правильного действия. По сути, воспроизводится звук, а для переменной задается значение true (для просмотра функции обновления ) в соответствии с другим именем тела.

01
02
03
04
05
06
07
08
09
10
11
12
function onCollision(e)
    if(e.other.name == ‘moon’) then
        hitMoon = true
        audio.play(explo)
    elseif(e.other.name == ‘star’) then
        audio.play(star)
        starHit = e.other
        hitStar = true
    elseif(e.other.name == ‘goal’) then
        hitGoal = true
    end
end

Чтобы начать игру, необходимо вызвать функцию Main . С помощью приведенного выше кода мы сделаем это здесь:

1
Main()

Файл Default.png — это изображение, которое будет отображаться сразу после запуска приложения, пока iOS загружает основные данные для отображения главного экрана. Добавьте это изображение в исходную папку вашего проекта, оно будет автоматически добавлено компилятором Corona.


Используя графику, созданную ранее, теперь вы можете создать красивый и красивый значок. Размер значка для iPhone без использования сетчатки составляет 57x57px, но для версии с сетчаткой — 114x114px, а для магазина iTunes требуется версия 512x512px. Я предлагаю сначала создать версию 512×512, а затем уменьшить ее для других размеров.

Для этого не нужно иметь закругленные углы или прозрачные блики, iTunes и iPhone сделают это за вас.


Пришло время сделать финальный тест. Откройте Corona Simulator, перейдите в папку вашего проекта и нажмите «Открыть». Если все работает, как ожидалось, вы готовы к последнему шагу!


В симуляторе Corona зайдите в File> Build и выберите ваше целевое устройство. Заполните необходимые данные и нажмите кнопку « Создать» . Подождите несколько секунд, и ваше приложение будет готово для тестирования устройства и / или отправки для распространения!


Поэкспериментируйте с конечным результатом и попробуйте сделать свою собственную версию игры!

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