Статьи

Построить игру Match Shapes — Добавление взаимодействия

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


  1. Создайте игру Match Shapes — создание интерфейса
  2. Построить игру Match Shapes — Добавление взаимодействия

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


Эта функция добавляет необходимых слушателей к кнопкам 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
function showCredits:tap(e)
    playBtn.isVisible = false
    creditsBtn.isVisible = false
    creditsView = display.newImage(‘credits.png’, 0, display.contentHeight)
 
    transition.to(creditsView, {time = 300, y = display.contentHeight — 25, onComplete = function() creditsView:addEventListener(‘tap’, hideCredits) end})
end

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

1
2
3
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})
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
    — Game Background
 
gameBg = display.newImage(‘gameBg.png’, 10, 350)

Заполнители — это фоновая графика, используемая для представления места, куда следует перетаскивать реальные фигуры. Следующие строки создают их и размещают на сцене.

1
2
3
4
5
— Place holders
 
sHolder = display.newImage(‘sHolder.png’, 15, 130)
pHolder = display.newImage(‘pHolder.png’, 115, 130)
tHolder = display.newImage(‘tHolder.png’, 215, 130)

Сообщение инструкции будет анимировано, когда игра начнется. Вы можете изменить время его появления, изменив код performWithDelay() .

1
2
3
4
— Instructions
 
ins = display.newImage(‘instructions.png’, 45, 270)
transition.from(ins, {time = 200, alpha = 0.1, onComplete = function() timer.performWithDelay(2000, function() transition.to(ins, {time = 200, alpha = 0.1, onComplete = function() display.remove(ins) ins = nil end}) end) end})

Формы, которые будут использоваться, создаются в следующих нескольких строках кода.

01
02
03
04
05
06
07
08
09
10
11
12
    — Shapes
 
    square = display.newImage(‘square.png’, 240, 386)
    pentagon = display.newImage(‘pentagon.png’, 32, 386)
    triangle = display.newImage(‘triangle.png’, 131, 386)
 
    square.name = ‘square’
    pentagon.name = ‘pentagon’
    triangle.name = ‘triangle’
 
    gameListeners()
end

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

1
2
3
4
5
6
function gameListeners()
    function gameListeners()
    square:addEventListener(‘touch’, dragShape)
    triangle:addEventListener(‘touch’, dragShape)
    pentagon:addEventListener(‘touch’, dragShape)
end

Мы будем использовать отличную и полезную функцию для обнаружения столкновений без физики. Вы можете найти оригинальный пример и исходный код в CoronaLabs Code Exchange .

1
2
3
4
5
6
7
function hitTestObjects(obj1, obj2)
        local left = obj1.contentBounds.xMin <= obj2.contentBounds.xMin and obj1.contentBounds.xMax >= obj2.contentBounds.xMin
        local right = obj1.contentBounds.xMin >= obj2.contentBounds.xMin and obj1.contentBounds.xMin <= obj2.contentBounds.xMax
        local up = obj1.contentBounds.yMin <= obj2.contentBounds.yMin and obj1.contentBounds.yMax >= obj2.contentBounds.yMin
        local down = obj1.contentBounds.yMin >= obj2.contentBounds.yMin and obj1.contentBounds.yMin <= obj2.contentBounds.yMax
        return (left or right) and (up or down)
end

Это основная функция этой игры, она обрабатывает перетаскивание объекта, проверяя положение объекта и перемещая его в положение события.

1
2
3
4
5
6
7
function dragShape(e)
    if(e.phase == ‘began’) then
        lastX = ex — e.target.x
        lastY = ey — e.target.y
    elseif(e.phase == ‘moved’) then
        e.target.x = ex — lastX
        e.target.y = ey — lastY

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

1
2
3
4
5
6
elseif(e.target.name == ‘square’ and e.phase == ‘ended’ and hitTestObjects(e.target, sHolder)) then
        e.target.x = 60.5
        e.target.y = 175
        e.target:removeEventListener(‘touch’, dragShape)
        correct = correct + 1
        audio.play(correctSnd)

Тот же метод используется для треугольника. Если правильная форма помещена в правильное место, слушатель перетаскивания формы удаляется.

1
2
3
4
5
6
elseif(e.target.name == ‘triangle’ and e.phase == ‘ended’ and hitTestObjects(e.target, tHolder)) then
        e.target.x = 260
        e.target.y = 169
        e.target:removeEventListener(‘touch’, dragShape)
        correct = correct + 1
        audio.play(correctSnd)

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

1
2
3
4
5
6
7
elseif(e.target.name == ‘pentagon’ and e.phase == ‘ended’ and hitTestObjects(e.target, pHolder)) then
        e.target.x = 160
        e.target.y = 172
        e.target:removeEventListener(‘touch’, dragShape)
        correct = correct + 1
        audio.play(correctSnd)
end

Наконец, мы проверим правильность расположения трех фигур, а затем воспроизведем звук и назовем оповещение, если оно правильное.

1
2
3
4
5
6
    if(e.phase == ‘ended’ and correct == 3) then
        audio.stop()
        audio.play(winSnd)
        alert()
    end
end

Функция оповещения создает представление оповещения, оживляет его и завершает игру.

1
2
3
4
function alert()
    alertView = display.newImage(‘win.png’, 95, 270)
    transition.from(alertView, {time = 200, alpha = 0.1})
end

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

1
Main()

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


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

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


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


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


В этой серии вы узнали о перетаскивании объектов и обнаружении столкновений без использования физического движка. Это может снизить потребление памяти приложением и повысить производительность. Вы можете поэкспериментировать с конечным результатом и попытаться сделать собственную версию игры!

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