Статьи

Построить игру по воздушному хоккею — добавление взаимодействия

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


  1. Построить игру по воздушному хоккею — создание интерфейса
  2. Построить игру по воздушному хоккею — добавление взаимодействия

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


Эта функция добавляет необходимых слушателей к кнопкам 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

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

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 = titleBg.y
    transition.to(titleBg, {time = 300, y = (display.contentHeight * 0.5) — (titleBg.height + 50)})
    transition.to(creditsView, {time = 300, y = (display.contentHeight * 0.5) + 35, onComplete = function() creditsView:addEventListener(‘tap’, hideCredits) end})
end

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

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});
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})

Здесь мы создаем 6 линий, которые будут использоваться в качестве стен стола.

1
2
3
4
5
6
7
8
— Walls
 
left = display.newLine(-1, display.contentHeight * 0.5, -1, display.contentHeight * 2)
right = display.newLine(display.contentWidth+1, display.contentHeight * 0.5, display.contentWidth+1, display.contentHeight * 2)
topLeft = display.newLine(0, -1, display.contentWidth — 120, -1)
topRight = display.newLine(display.contentWidth, -1, display.contentWidth * 1.6, -1)
bottomLeft = display.newLine(0, display.contentHeight, display.contentWidth — 120, display.contentHeight)
bottomRight = display.newLine(display.contentWidth, display.contentHeight, display.contentWidth * 1.6, display.contentHeight)

Этот код помещает фон игры в сцену.

1
2
3
— Game Bg
 
gameBg = display.newImage(‘gameBg.png’)

Добавьте весло Player со следующим кодом:

1
2
3
— Player
 
player = display.newImage(‘paddle1.png’, display.contentCenterX-25, display.contentHeight-100)

Весло врага создано этой линией:

1
2
3
— Enemy
 
enemy = display.newImage(‘paddle2.png’, display.contentCenterX-25, 10)

Далее мы добавляем оценки TextFields, чтобы использовать их позже.

1
2
3
4
5
6
7
— Scores
 
enemyScore = display.newText(‘0’, 289, 206, ‘Courier-Bold’, 20)
enemyScore:setTextColor(227, 2, 2)
 
playerScore = display.newText(‘0’, 289, 240, ‘Courier-Bold’, 20)
playerScore:setTextColor(227, 2, 2)

Это шайба, она появится в центре сцены.

1
2
3
— Puck
 
puck = display.newImage(‘puck.png’, display.contentCenterX-20, display.contentCenterY-20)

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
— Set Physics
 
physics.addBody(left, ‘static’)
physics.addBody(right, ‘static’)
physics.addBody(topLeft, ‘static’)
physics.addBody(bottomLeft, ‘static’)
physics.addBody(topRight, ‘static’)
physics.addBody(bottomRight, ‘static’)
 
physics.addBody(puck, ‘dynamic’, {radius = 20, bounce = 0.4})
puck.isFixedRotation = true
physics.addBody(player, ‘dynamic’, {radius = 25})
physics.addBody(enemy, ‘static’, {radius = 25})
 
gameListeners(‘add’)
end

Следующая функция обрабатывает перетаскивание игрока.

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

1
2
3
function dragBody(event)
    gameUI.dragBody( event, { maxForce=20000, frequency=10, dampingRatio=0.2, center=true } )
end

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

01
02
03
04
05
06
07
08
09
10
11
12
function gameListeners(action)
    if(action == ‘add’) then
        player:addEventListener(‘touch’, dragBody)
        Runtime:addEventListener(‘enterFrame’, update)
        timerSrc = timer.performWithDelay(100, moveEnemy, 0)
    else
        player:removeEventListener(‘touch’, dragBody)
        Runtime:removeEventListener(‘enterFrame’, update)
        timer.cancel(timerSrc)
        timerSrc = nil
    end
end

Таймер используется для перемещения противника, это создаст задержку, позволяющую противнику пропустить удар по шайбе.

1
2
3
4
5
6
7
function moveEnemy(e)
    — Move Enemy
     
    if(puck.y < display.contentHeight * 0.5) then
        transition.to(enemy, {time = 300, x = puck.x})
    end
end

Функция обновления запускает каждый кадр.

Эта часть кода проверяет, вышла ли шайба со сцены через пространство, где не было добавлено ни одной стены. Если true, это увеличивает текстовое поле подходящего балла.

1
2
3
4
5
6
7
8
function update()
    — Score
     
    if(puck.y > display.contentHeight) then
        enemyScore.text = tostring(tonumber(enemyScore.text) + 1)
    elseif(puck.y < -5) then
        playerScore.text = tostring(tonumber(playerScore.text) + 1)
    end

Эти линии сбрасывают положение шайбы, когда она покидает сцену и воспроизводит звук цели.

1
2
3
4
5
6
7
8
— Reset Puck position
     
if(puck.y > display.contentHeight or puck.y < -5) then
    puck.x = display.contentCenterX
    puck.y = display.contentCenterY
    puck.isAwake = false
    audio.play(bell)
end

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

1
2
3
4
5
6
    — Keep paddle on player side
     
    if(player.y < display.contentWidth — 60) then
        player.y = display.contentWidth — 60
    end
end

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

1
Main()

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


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

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


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


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


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

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