Пройденный материал
На этом уроке мы нарисовали лабиринт, и проходили его управляя шариком, который следовал за курсором мышки.
В конце лабиринта мы поставим спрайт GemSprite и если шарик в него врежется мы загрузим еще один уровень
Рисование стен
Создав новый проект у нас сразу есть стены, очерчивающие прямоугольник игрового поля. В файле level.txt они обозначены при помощи символа-решетки - '#'.
В коде игры символ решетки зарегистрирован для рисования спрайтов стен:
register('#', WallSprite::new)
.onInit(w -> w.setColor(WallColor.BLACK));
Так что все, что нам нужно сделать - это нарисовать лабиринт. Например, такой:
#################################
# # # # # #
# x # # # # #
# # # # # #
# # # # # # ##### #
# # # # # #
# # # # # #
# # # # # #
# # ##### ######### # #
# # # # # #
# # # # # #
# # # # # #
# ##### # ##### # #####
# # # # # #
# # # # # #
# # # # # #
##### # ##### ##### # #
# # # # #
# # # # #
# # # # #
# ##### ##### # ##### #
# # # # # # #
# # # # # # #
# # # # # # #
##### # # ##### #########
# # # # #
# # # # #
# # # # #
# # ######### ##### # #
# # # #
# # # o #
# # # #
#################################
Чтобы не терять времени сразу поставим в лабиринт шарик 'o' и выход 'x'. Так же нам надо зарегистрировать эти символы. Для символа 'x' мы будем использовать новый спрайт - GemSprite.
Получился следующий код:
public void setup() {
setBackground(new SpaceBackground());
register('#', WallSprite::new)
.onInit(w -> w.setColor(WallColor.BLACK));
register('x', GemSprite::new);
register('o', BallSprite::new)
.onInit(b -> b.setColor(BallColor.GREEN));
load("/level.txt");
}
Перемещение шарика при помощи мышки
Если сейчас запустить проект - мы увидим лабиринт, шарик и кристалл. Но пока шариком управлять нельзя. Для того чтобы шарик полетел за мышкой нужно установить ему скорость и вызывать ai::followMouseXY на каждый кадр игры.
register('o', BallSprite::new)
.onInit(b -> b.setColor(BallColor.GREEN))
.onInit(b -> b.setSpeed(12))
.onLoop(ai::followMouseXY);
Непроницаемые для шарика стены
Если запустить игру с таким кодом шарика, шарик будет лететь за курсором. Но он будет игнорировать стены полностью! Добавим одну строчку, чтобы шарик останавливался, врезаясь в стену:
register('o', BallSprite::new)
.onInit(b -> b.setColor(BallColor.GREEN))
.onInit(b -> b.setSpeed(12))
.onLoop(ai::followMouseXY)
.onCollision(ai::stopXY);
Спрайт GemSprite
Если мы хотим изменить вид спрайта GemSprite, есть возможность поменять его цвет и картинку:
register('x', GemSprite::new)
.onInit(g -> g.setColor(GemColor.BLUE))
.onInit(g -> g.setIcon(GemIcon.FIRE));
Доступные цвета
Название цвета
| |
GREEN
| |
WHITE | |
ORANGE | |
BLUE | |
VIOLET | |
NONE | (невидимый)
|
Доступные картинки (иконки)
Название иконки
| |
QUESTION | |
HEART | |
SKULL | |
FIRE | |
ONE_BALL | |
SNAIL_CIRCLE | |
LIGHTNING_SQUARE | |
EXPAND | |
SNAIL_SQUARE | |
LIGHTNING_CIRCLE | |
SHRINK | |
THREE_BALLS | |
NONE | Без иконки
|
Загрузка нового уровня
Теперь, когда у нас первый уровень лабиринта готов и в нем есть шарик и спрайт, означающий выход, создадим еще один лабиринт - level-2.txt.
Для этого на панели Project надо развернуть список файлов как показано на картинке:
Затем кликнуть правой кнопкой по строчке src и выбрать New -> File:
Должно появится окошко, куда нужно ввести название файла - level-2.txt и нажать OK:
В результате должно получится следующее:
Создадим второй уровень игры - другой лабиринт. Например, такой:
###############################
#o # # # #
# # # # #
# #### ####### # ### ## #
# # # # #
# # # # #
# ########## ####### # ####
# # # # # #
# # # # # #
####### # # # # # # ####
# # # # # # # #
# # # # # # # #
# # ########## ####### ####
# # # # #
# # # # #
# ####### ########## #### #
# # # # # # #
# # # # # # #
####### # # # # # #######
# # # # # #
# # # # # #
# # ####### # ####### # #
# # # # # # #
# # # # # # #
# ####### ####### ##########
# #
# #
#### # ####### #############
# # # #
# # # x#
###############################
Нарисуем этот лабиринт в созданном файле level-2.txt
Осталось сделать так, чтобы этот уровень загрузился, когда шарик врезается в драгоценный камень.
Сделать это очень просто, в коде отвечающим за GemSprite напишем следующее:
register('x', GemSprite::new)
.onInit(g -> g.setColor(GemColor.BLUE))
.onInit(g -> g.setIcon(GemIcon.FIRE))
.onCollision(g -> load("/level-2.txt"));
В последней строчке этого кода - самое главное - если чтото врежется в драгоценный камень - произойдет загрузка второго уровня (load("/level-2.txt")
)
Домашнее задание
- Нарисовать еще один уровень. Сделать так, чтобы из второго уровня попадали в третий.
Подсказка: Для этого надо будет зарегистрировать еще один GemSprite под другой буквой и во втором уровне рисовать его вместо 'x'. В событии onCollision этого, нового, спрайта загружать третий уровень. - Сделать возможным переход из второго уровня не только в третий, но и обратно в первый. И так же из третьего - возможность вернуться во второй.