13 ноября 2016 г

Отправлено 16 нояб. 2016 г., 8:39 пользователем Dimitrijs Fedotovs   [ обновлено 16 нояб. 2016 г., 11:16 ]

Пройденный материал

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

В конце лабиринта мы поставим спрайт 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"))

Домашнее задание

  1. Нарисовать еще один уровень. Сделать так, чтобы из второго уровня попадали в третий.
    Подсказка: Для этого надо будет зарегистрировать еще один GemSprite под другой буквой и во втором уровне рисовать его вместо 'x'. В событии onCollision этого, нового, спрайта загружать третий уровень.
  2. Сделать возможным переход из второго уровня не только в третий, но и обратно в первый. И так же из третьего - возможность вернуться во второй.
Comments