Статьи

Создайте звуковую игру памяти — Game Logic

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


  1. Создать игру на основе звуковой памяти — Создание интерфейса
  2. Создайте звуковую игру памяти — Game Logic

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


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

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

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

1
2
3
4
function hideCredits:tap(e)
    transition.to(creditsView, {time = 300, y = display.contentHeight, 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

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

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

Этот код размещает изображения игровых кнопок на сцене.

01
02
03
04
05
06
07
08
09
10
11
— Add Squares
     
r.gfx = display.newImage(‘red.png’, 75, 155)
g.gfx = display.newImage(‘green.png’, 165, 155)
ye.gfx = display.newImage(‘yellow.png’, 75, 245)
b.gfx = display.newImage(‘blue.png’, 165, 245)
     
r.gfx.name = ‘r’
g.gfx.name = ‘g’
ye.gfx.name = ‘ye’
b.gfx.name = ‘b’

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

1
2
3
4
— Instructions Message
     
local ins = display.newImage(‘message.png’, 61, 373)
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 gameTimer = timer.performWithDelay(500, playLevel, #currentLevel) end}) end) end})

Эта кнопка используется для проверки ввода пользователя и проверки его уровня. Это невидимо по умолчанию.

1
2
3
4
— Check Button
     
check = display.newImage(‘checkBtn.png’, 135, 406)
check.isVisible = false

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
function gameListeners(action)
    if(action == ‘add’) then
        r.gfx:addEventListener(‘tap’, onTap)
        g.gfx:addEventListener(‘tap’, onTap)
        ye.gfx:addEventListener(‘tap’, onTap)
        b.gfx:addEventListener(‘tap’, onTap)
        check:addEventListener(‘tap’, checkInput)
    else
        r.gfx:removeEventListener(‘tap’, onTap)
        g.gfx:removeEventListener(‘tap’, onTap)
        ye.gfx:removeEventListener(‘tap’, onTap)
        b.gfx:removeEventListener(‘tap’, onTap)
        check:removeEventListener(‘tap’, checkInput)
        gameTimer = nil
    end
end

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

01
02
03
04
05
06
07
08
09
10
11
12
function playLevel()
    if(times <= #currentLevel) then
        transition.from(currentLevel[times].gfx, {time = 200, alpha = 0.1})
        audio.play(currentLevel[times].s)
        times = times + 1
    end
     
    if(times == #currentLevel+1) then
        check.isVisible = true
        gameListeners(‘add’)
    end
end

Нажатие кнопок в центре вызовет эту функцию. Он будет воспроизводить звук и записывать его значение в таблицу userInput . Эта таблица будет использоваться в следующей функции для сравнения звуков.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
function onTap(e)
    if(e.target.name == ‘r’) then
        table.insert(userInput, r.gfx)
        audio.play(rs)
        transition.from(e.target, {time = 200, alpha = 0.1})
    elseif(e.target.name == ‘g’) then
        table.insert(userInput, g.gfx)
        audio.play(gs)
        transition.from(e.target, {time = 200, alpha = 0.1})
    elseif(e.target.name == ‘ye’) then
        table.insert(userInput, ye.gfx)
        audio.play(ye.s)
        transition.from(e.target, {time = 200, alpha = 0.1})
    elseif(e.target.name == ‘b’) then
        table.insert(userInput, b.gfx)
        audio.play(bs)
        transition.from(e.target, {time = 200, alpha = 0.1})
    end
end

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
function checkInput(e)
    check.isVisible = false
     
    for i = 1, #currentLevel do
        if(userInput[i].name == currentLevel[i].gfx.name) then
            correct = correct + 1
        end
    end
     
    if(correct == #currentLevel) then
        alert(‘win’)
    else
        alert(‘lose’)
    end
end

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

01
02
03
04
05
06
07
08
09
10
11
function alert(action)
    gameListeners(‘rmv’)
     
    if(action == ‘lose’) then
        alertView = display.newImage(‘lose.png’, 110, 218)
    else
        alertView = display.newImage(‘win.png’, 110, 218)
    end
     
    transition.from(alertView, {time = 200, alpha = 0.1})
end

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

1
Main()

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


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

iTunes и iPhone создадут закругленные углы и прозрачные блики.


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


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


В этой серии мы узнали о загрузке звука, воспроизведении и сравнении таблиц. Это навыки, которые могут быть очень полезны во многих играх.

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

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