Это вторая часть нашего учебного пособия по Corona SDK Unblock Puzzle. В сегодняшнем уроке мы добавим наш интерфейс, создав интерактивные элементы игры для разблокировки. Читай дальше!
Где мы остановились. , ,
Пожалуйста, ознакомьтесь с первой частью серии, чтобы полностью понять и подготовиться к этому уроку.
Шаг 1. Слушатели кнопки «Пуск»
Эта функция добавляет необходимых слушателей к кнопкам 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
|
Шаг 2: Показать кредиты
Экран кредитов отображается, когда пользователь нажимает кнопку «о», к представлению кредитов добавляется прослушиватель касаний, чтобы удалить его.
|
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 + 40)})
transition.to(creditsView, {time = 300, y = (display.contentHeight * 0.5) + 35, onComplete = function() creditsView:addEventListener(‘tap’, hideCredits) end})
end
|
Шаг 3: Скрыть кредиты
При нажатии на экран кредитов, он будет отключен со сцены и удален.
|
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
|
Шаг 4: Показать игровой вид
При нажатии кнопки « Пуск» вид заголовка изменяется и удаляется, открывая вид игры. В этом представлении есть много частей, поэтому мы разделим их на следующих шагах.
|
1
2
|
function showGameView:tap(e)
transition.to(titleView, {time = 300, x = -titleView.height, onComplete = function() startButtonListeners(‘rmv’) display.remove(titleView) titleView = nil end})
|
Шаг 5: Фон игры
Этот код размещает фоновое изображение игры на сцене:
|
1
2
3
|
— Game BG
gameBg = display.newImage(‘gameBg.png’, 10, 10)
|
Шаг 6: Движения TextField
Затем мы добавляем текстовое поле движений на сцену. Это будет подсчитывать количество ходов, сделанных игроком.
|
1
2
3
4
|
— Movements Textfield
movements = display.newText(‘0’, 211, 66, display.systemFont, 16)
movements:setTextColor(224, 180, 120)
|
Шаг 7: Создать уровень
Эта часть создает блоки, определенные в переменной Level, используя оператор double для оператора.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
— Create Level
hblocks = display.newGroup()
vblocks = display.newGroup()
for i = 1, #l1 do
for j = 1, #l1[1] do
if(l1[i][j] == 1) then
local v = display.newImage(‘vrect.png’, 10 + (j * 50)-50, 120 + (i * 50)-50)
v:addEventListener(‘touch’, dragV)
vblocks:insert(v)
elseif(l1[i][j] == 2) then
local h = display.newImage(‘hrect.png’, 10 + (j * 50)-50, 120 + (i * 50)-50)
h:addEventListener(‘touch’, dragH)
hblocks:insert(h)
elseif(l1[i][j] == 3) then
s = display.newImage(‘square.png’, 10 + (j * 50)-50, 120 + (i * 50)-49)
s:addEventListener(‘touch’, dragH)
end
end
end
gameListeners(‘add’)
end
|
Шаг 8: Слушатели игр
Эта функция добавляет необходимых слушателей для запуска игровой логики.
|
1
2
3
4
5
6
7
|
function gameListeners(action)
if(action == ‘add’) then
Runtime:addEventListener(‘enterFrame’, update)
else
Runtime:removeEventListener(‘enterFrame’, update)
end
end
|
Шаг 9: Горизонтальное перетаскивание
Следующая функция обрабатывает горизонтальное перетаскивание блоков.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
function dragH(e)
e.target.lastX = 0
local currentX = 0
local initX = 0
if(e.phase == ‘began’) then
e.target.lastX = ex — e.target.x
initX = e.target.x
movements.text = tostring(tonumber(movements.text) + 1)
elseif(e.phase == ‘moved’) then
e.target.x = ex — e.target.lastX
currentX = e.target.x
— Calculate direction
if(initX < currentX) then
dir = ‘hl’ —horizontal-left
elseif(initX > currentX) then
dir = ‘hr’ —horizontal-right
end
end
end
|
Шаг 10: Вертикальное перетаскивание
Теперь мы создаем функцию вертикального перетаскивания.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
function dragV(e)
e.target.lastY = 0
local currentY = 0
local initY = 0
if(e.phase == ‘began’) then
e.target.lastY = ey — e.target.y
initY = e.target.y
movements.text = tostring(tonumber(movements.text) + 1)
elseif(e.phase == ‘moved’) then
e.target.y = ey — e.target.lastY
currentY = e.target.y
— Calculate direction
if(initY < currentY) then
dir = ‘vu’ —Vertical-upwards
elseif(initY > currentY) then
dir = ‘vd’ —Vertical-downwards
end
end
end
|
Шаг 11: Функция проверки попадания
Мы будем использовать отличную и полезную функцию для обнаружения столкновений без физики. Вы можете найти оригинальный пример и исходный код на веб-сайте 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
|
Шаг 12: Вертикальные границы
Этот код ограничивает движение, создавая виртуальные границы.
|
1
2
3
4
5
6
7
8
9
|
function update(e)
— Vertical Borders
for i = 1, vblocks.numChildren do
if(vblocks[i].y >= 370) then
vblocks[i].y = 370
elseif(vblocks[i].y <= 170) then
vblocks[i].y = 170
end
|
Шаг 13: Столкновения
Здесь мы обрабатываем столкновения между вертикальными и горизонтальными блоками.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
— Hit Test
if(hitTestObjects(vblocks[i], hblocks[i]) and dir == ‘vu’) then
vblocks[i].y = hblocks[i].y + 75
elseif(hitTestObjects(vblocks[i], hblocks[i]) and dir == ‘vd’) then
vblocks[i].y = hblocks[i].y — 75
end
if(hitTestObjects(vblocks[i], hblocks[i]) and dir == ‘hr’) then
hblocks[i].x = vblocks[i].x + 75
elseif(hitTestObjects(vblocks[i], hblocks[i]) and dir == ‘hl’) then
hblocks[i].x = vblocks[i].x — 75
end
if(hitTestObjects(s, vblocks[i])) then
sx = vblocks[i].x — 50
end
end
|
Шаг 14: Горизонтальные границы
Этот код ограничивает движение по горизонтали, создавая виртуальные границы.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
— Horizontal Borders
for j = 1, hblocks.numChildren do
if(hblocks[j].x >= 260) then
hblocks[j].x = 260
elseif(hblocks[j].x <= 60) then
hblocks[j].x = 60
end
end
— Square
if(sx >= 320) then
display.remove(s)
display.remove(vblocks)
display.remove(hblocks)
alert()
elseif(sx <= 35) then
sx = 35
end
end
|
Шаг 15: Оповещение
Функция оповещения останавливает игру, отображает сообщение и удаляет активных слушателей.
|
1
2
3
4
5
6
7
|
function alert()
gameListeners(‘rmv’)
local alertView = display.newImage(‘alert.png’, 80, display.contentHeight * 0.5 — 41)
transition.from(alertView, {time = 300, y = -82})
endend
end
|
Шаг 16: вызов основной функции
Чтобы начать игру, необходимо вызвать функцию Main . С помощью приведенного выше кода мы сделаем это здесь:
|
1
|
Main()
|
Шаг 17: Экран загрузки
Файл Default.png — это изображение, которое будет отображаться сразу после запуска приложения, пока iOS загружает основные данные для отображения главного экрана. Добавьте это изображение в исходную папку вашего проекта, оно будет автоматически добавлено компилятором Corona.
Шаг 18: Иконка
Используя графику, которую вы создали ранее, теперь вы можете создать красивый и красивый значок. Размер значка для iPhone без использования сетчатки составляет 57x57px, но для версии с сетчаткой — 114x114px, а для магазина iTunes требуется версия 512x512px. Я предлагаю сначала создать версию 512×512, а затем уменьшить ее для других размеров.
Это не должно иметь закругленные углы или прозрачные блики; iTunes и iPhone сделают это за вас.
Шаг 19: Тестирование в симуляторе
Пришло время сделать финальный тест. Откройте Corona Simulator, перейдите в папку вашего проекта и нажмите «Открыть». Если все работает, как ожидалось, вы готовы к последнему шагу!
Шаг 20: Построить
В симуляторе Corona зайдите в File> Build и выберите ваше целевое устройство. Заполните необходимые данные и нажмите кнопку « Создать» . Подождите несколько секунд, и ваше приложение будет готово для тестирования устройства и / или отправки для распространения!
Вывод
Из этого урока вы узнали, как оживить наш интерфейс, позволяя пользователю взаимодействовать с частями игры. Поэкспериментируйте с конечным результатом и попробуйте создать собственную версию игры! Надеюсь, вам понравился этот урок, и вы нашли его полезным. Спасибо за чтение!



