Статьи

Создайте игру Apple Catcher — добавьте взаимодействие

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


  1. Создайте игру Apple Catcher — создание интерфейса
  2. Создайте игру Apple Catcher — добавьте взаимодействие

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


Эта функция добавляет необходимых слушателей к кнопкам 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
— Basket
basket = display.newImage(‘basket.png’, 203, 240)

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

1
2
3
4
5
6
7
— Info Bar
     
infoBar = display.newImage(‘infoBar.png’, 280)
score = display.newText(‘0’, 65, -2, native.systemFontBold, 14)
score:setTextColor(0)
timeLeft = display.newText(’20’, 175, -2, native.systemFontBold, 14)
timeLeft:setTextColor(0)

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

1
2
3
4
5
6
7
— Add Physics
     
physics.addBody(basket, ‘static’)
 
— Game Listeners
     
gameListeners(‘add’)

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

01
02
03
04
05
06
07
08
09
10
11
12
13
function gameListeners(action)
    if(action == ‘add’) then
        timerSrc = timer.performWithDelay(500, update, 0)
        basket:addEventListener(‘collision’, onCollision)
        basket:addEventListener(‘touch’, dragBasket)
    else
        timer.cancel(timerSrc)
        timerSrc = nil
        basket:removeEventListener(‘collision’, onCollision)
        basket:removeEventListener(‘touch’, dragBasket)
        physics.stop()
    end
end

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

1
2
3
4
5
6
7
8
9
— Drag Basket
 
function dragBasket(e)
    if(e.phase == ‘began’) then
        lastX = ex — basket.x
    elseif(e.phase == ‘moved’) then
        basket.x = ex — lastX
    end
end

Функция обновления выполняется каждые полсекунды. Каждый раз, когда генерируется случайное число, а затем проверяется, будет ли добавлено яблоко или палка на сцену. Затем предмет добавляется в физический движок и автоматически притягивается вниз.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
function update(e)
    — Add Apple or Stick
     
    local rx = math.floor(math.random() * display.contentWidth)
    local r = math.floor(math.random() * 4) — 0, 1, 2, or 3 (3 is stick)
     
    if(r == 3) then
        local stick = display.newImage(‘stick.png’, rx, -20)
        stick.name = ‘stick’
        physics.addBody(stick)
    else
        local apple = display.newImage(‘apple.png’, rx, -40)
        apple.name = ‘apple’
        physics.addBody(apple)
    end

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

1
2
3
4
5
6
7
— Decrease Timer
     
times = times + 1
if(times == 2) then
    timeLeft.text = tostring(tonumber(timeLeft.text) — 1)
    times = 0
end

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

1
2
3
4
5
6
    — Check if timer is over
     
    if(timeLeft.text == ‘0’) then
        alert()
    end
end

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

1
2
3
4
5
6
7
8
9
function onCollision(e)
    if(e.other.name == ‘apple’) then
        — Remove Apple
        display.remove(e.other)
        — Display animation
        local scoreAnim = display.newText(‘+10’, basket.x, basket.y-10, native.systemFontBold, 16)
        transition.to(scoreAnim, {time = 600, y = scoreAnim.y — 30, alpha = 0, onComplete = function() display.remove(scoreAnim) scoreAnim = nil end})
        — Update Score
        score.text = tostring(tonumber(score.text) + 10)

При этом используется тот же метод, что и на последнем шаге, на этот раз уменьшается оценка

01
02
03
04
05
06
07
08
09
10
elseif(e.other.name == ‘stick’) then
        —Remove Stick
        display.remove(e.other)
        — Display animation
        local scoreAnim = display.newText(‘-10’, basket.x, basket.y-10, native.systemFontBold, 16)
        transition.to(scoreAnim, {time = 600, y = scoreAnim.y — 30, alpha = 0, onComplete = function() display.remove(scoreAnim) scoreAnim = nil end})
        — Update Score
        score.text = tostring(tonumber(score.text) — 10)
    end
end

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

1
2
3
4
5
6
7
function alert()
    gameListeners(‘remove’)
    local alertView = display.newImage(‘alert.png’, 110, 74)
    transition.from(alertView, {time = 300, xScale = 0.5, yScale = 0.5})
    local totalScore = display.newText(score.text, display.contentCenterX-11, display.contentCenterY + 24, native.systemFontBold, 21)
    totalScore:setTextColor(72, 34, 0)
end

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

1
Main()

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


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

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


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


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


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

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