Статьи

Corona SDK: разработайте игру, похожую на Frenzic — заключительные шаги

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


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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function placeBlock:tap(e)
    eventTarget = e.target
     
    — Check if position is available
     
    local position = {currentXPosition, currentYPosition}
     
    if(position[1] == 5 and position[2] == 5 and eventTarget.a == false) then
        blocks[#blocks].x = eventTarget.x + position[1]
        blocks[#blocks].y = eventTarget.y + position[2]
        eventTarget.a = true
        blockPlaced()
    elseif(position[1] == 35 and position[2] == 5 and eventTarget.b == false) then
        blocks[#blocks].x = eventTarget.x + position[1]
        blocks[#blocks].y = eventTarget.y + position[2]
        eventTarget.b = true
        blockPlaced()
    elseif(position[1] == 5 and position[2] == 35 and eventTarget.c == false) then
        blocks[#blocks].x = eventTarget.x + position[1]
        blocks[#blocks].y = eventTarget.y + position[2]
        eventTarget.c = true
        blockPlaced()
    elseif(position[1] == 35 and position[2] == 35 and eventTarget.d == false) then
        blocks[#blocks].x = eventTarget.x + position[1]
        blocks[#blocks].y = eventTarget.y + position[2]
        eventTarget.d = true
        blockPlaced()
    end
end

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function blockPlaced()
 
    — Push block to containers blocks array
     
    if(eventTarget.name == ‘up’) then
        table.insert(up.blocksGFX, blocks[#blocks])
        up.blocks = up.blocks + 1
    elseif(eventTarget.name == ‘right’) then
        table.insert(right.blocksGFX, blocks[#blocks])
        right.blocks = right.blocks + 1
    elseif(eventTarget.name == ‘down’) then
        table.insert(down.blocksGFX, blocks[#blocks])
        down.blocks = down.blocks + 1
    elseif(eventTarget.name == ‘left’) then
        table.insert(left.blocksGFX, blocks[#blocks])
        left.blocks = left.blocks + 1
    end
    — Score
     
    score = score + 1
     
    — Sound
     
    media.playEventSound(‘bell.caf’)

Следующий код проверяет, был ли контейнер заполнен одним цветным блоком с использованием массива контейнера. Это увеличивает счет на 150 и воспроизводит соответствующий звук. Функция для удаления блоков называется -мы создадим эту функцию на следующих шагах.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
if(up.blocks == 4) then
        if(up.blocksGFX[1].name == up.blocksGFX[2].name and up.blocksGFX[2].name == up.blocksGFX[3].name and up.blocksGFX[3].name == up.blocksGFX[4].name) then
            score = score + 150
            complete()
        end
    elseif(right.blocks == 4) then
        if(right.blocksGFX[1].name == right.blocksGFX[2].name and right.blocksGFX[2].name == right.blocksGFX[3].name and right.blocksGFX[3].name == right.blocksGFX[4].name) then
            score = score + 150
            complete()
        end
    elseif(down.blocks == 4) then
        if(down.blocksGFX[1].name == down.blocksGFX[2].name and down.blocksGFX[2].name == down.blocksGFX[3].name and down.blocksGFX[3].name == down.blocksGFX[4].name) then
            score = score + 150
            complete()
        end
    elseif(left.blocks == 4) then
        if(left.blocksGFX[1].name == left.blocksGFX[2].name and left.blocksGFX[2].name == left.blocksGFX[3].name and left.blocksGFX[3].name == left.blocksGFX[4].name) then
            score = score + 150
            complete()
        end
    end

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

1
2
3
4
if(up.blocks == 4 or right.blocks == 4 or down.blocks == 4 or left.blocks == 4) then
        score = score + 50
        complete()
    end

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

1
2
3
4
5
6
    scoreTF.text = score
    timer.cancel(timerSource)
    timerSource = nil
    timerSource = timer.performWithDelay(3000, timesUp, 0)
    newBlock(false)
end

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function complete()
    media.playEventSound(‘bell4.caf’)
    removeBlocks()
    eventTarget.a = false
    eventTarget.b = false
    eventTarget.c = false
    eventTarget.d = false
end
 
function removeBlocks()
    if(eventTarget.name == ‘up’) then
        for i = 1, 4 do
            display.remove(up.blocksGFX[i])
            up.blocksGFX[i] = nil
        end
        up.blocks = 0
    elseif(eventTarget.name == ‘right’) then
        for i = 1, 4 do
            display.remove(right.blocksGFX[i])
            right.blocksGFX[i] = nil
        end
        right.blocks = 0
    elseif(eventTarget.name == ‘down’) then
        for i = 1, 4 do
            display.remove(down.blocksGFX[i])
            down.blocksGFX[i] = nil
        end
        down.blocks = 0
    elseif(eventTarget.name == ‘left’) then
        for i = 1, 4 do
            display.remove(left.blocksGFX[i])
            left.blocksGFX[i] = nil
        end
        left.blocks = 0
    end
end

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

01
02
03
04
05
06
07
08
09
10
11
12
13
function alert()
    timer.cancel(timerSource)
    timerSource = nil
    native.showAlert( ‘Game Over’, ‘Your Score: ‘ .. score, {‘OK’}, alertHandler)
end
 
function alertHandler(e)
    if(e.action == ‘clicked’) then
        if (e.index == 1) then
            restart()
        end
    end
end

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

1
2
3
4
function restart(e)
    display.remove(gameView)
    Main()
end

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

1
Main()

Frenzic_App

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


Frenzic_App

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

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


Frenzic_App

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


Frenzic_App

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


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