Всех вас приветствею, дорогие читатели! И перейдем сразу к делу.
В прошлой статье мы остановились на том моменте, где нам нужно было заставить мяч отскакивать от стен. Так давайте сделаем это.
Заставим наконец мяч отскакивать от стен
Для начала, давайте разберем все возможные случаи, при столкновении мяча со стеной, на примере одного из направлений. За основу давайте возьмем полет мяча влево вверх, при dir=0.
В данном случае возможны три варианта развития событий при столкновении со стеной:
В первом случае мяч летит влево вверх и встречается со стеной сверху, при этом слева от него стены нет. В этом случае он должен сменить направление влево вниз, согласно красной стрелке, т.е. переменная dir должна смениться с 0 на 2.
Во втором случае мяч летит влево вверх и встречается со стеной слева, при этом сверху от него стены нет. В этом случае он должен сменить направление вправо вверх, согласно красной стрелке, т.е. переменная dir должна смениться с 0 на 1.
Ну и в третьем случае мяч так же летит влево вверх и встречается со стеной слева, при этом сверху от него так же находится стена, т.е. он утыкается прямо в угол. Это редкий случай, но он возможен. В этом случае он должен сменить направление на обратное, т.е. вправо вниз, согласно красной стрелке, т.е. переменная dir должна смениться с 0 на 3.
Теперь для данного направления перенесем все в код:
if dir=0 && place_meeting(x,y-2,Wall) {dir=2}
if dir=0 && place_meeting(x-2,y,Wall) {dir=1}
if dir=0 && place_meeting(x,y-2,Wall) && place_meeting(x-2,y,Wall) {dir=3}
Думаю вы уже вполне можете читать код самостоятельно. Если направление равно 1 и на два пикселя выше мяча есть стена, то направление станет равно 2. Если направление 0 и на два пикселя левее от мяча стена, то направление 1. И если направление 0 и на два пикселя выше есть стена и на два пикселя левее есть стена, то направление 3.
Теперь, пропишем то же самое для всех остальных направлений. И в итоге весь код в событии шага мяча будет следующим:
if fixed=true {x = Bat.x}
if fixed=false {
if dir=0 {
if !place_meeting(x-2,y-2,Wall) {x-=2 y-=2}
}
if dir=1 {
if !place_meeting(x+2,y-2,Wall) {x+=2 y-=2}
}
if dir=2 {
if !place_meeting(x-2,y+2,Wall) {x-=2 y+=2}
}
if dir=3 {
if !place_meeting(x+2,y+2,Wall) {x+=2 y+=2}
}
//Поле влево вверх
if dir=0 && place_meeting(x,y-2,Wall) {dir=2}
if dir=0 && place_meeting(x-2,y,Wall) {dir=1}
if dir=0 && place_meeting(x,y-2,Wall) && place_meeting(x-2,y,Wall) {dir=3}
//Поле вправо вверх
if dir=1 && place_meeting(x,y-2,Wall) {dir=3}
if dir=1 && place_meeting(x+2,y,Wall) {dir=0}
if dir=1 && place_meeting(x,y-2,Wall) && place_meeting(x+2,y,Wall) {dir=2}
//Поле влево вниз
if dir=2 && place_meeting(x-2,y,Wall) {dir=3}
//Поле вправо вниз
if dir=3 && place_meeting(x+2,y,Wall) {dir=2}
}
Как видите, при полете вниз влево и вправо возможен только один вариант, так как стены снизу нет.
Так же в коде думаю вы заметили комментарии. В GMS2 для удобства чтения и тобы самому не запутаться в коде спустя какое-то время, можно оставлять комментарии. Для этого достаточно поставить два слэша // . Все что будет написано после этих знаков, будет игнорироваться. Т.е. тут вы можете писать все что угодно, даже на русском. При запуске цикла игры, эти строчки учитываться н будут, даже если вы после // напишите код. В самом GMS2 все удобно разбивается на цвета: функции, переменные и те же комментарии (они выделяются зеленым).
Делаем отбитие мяча самой битой
Теперь тоже самое нужно проделать и для биты. Но для начала я бы советовал ввести переменную скорости мяча как мы это делали для биты. Вообще, это нужно было сделать в самом начале. В событии создания мяча пропишем переменную скорости:
fixed=true
dir=choose(0,1)
spd=2
Ничего страшного что переменная скорости у мяча называется так же как и у самой биты - spd.
Теперь в событии шага мяча внесем везде переменную скорости, заменяя 2-ку:
А теперь непосредственно займемся отскоком мяча от биты. Там возможны всего два варианта:
- когда мяч летит вниз влево и сталкивается с битой, то меняет направление на вверх влево, т.е. с 2 на 0
- когда мяч летит вниз вправо и сталкивается с битой, то меняет направление на вверх вправо, т.е. с 3 на 1
Добавим всего 2 строчки кода:
if dir=2 && place_meeting(x-spd,y+spd,Bat) {dir=0}
if dir=3 && place_meeting(x+spd,y+spd,Bat) {dir=1}
Тут я надеюсь даже объяснять ничего не надо.
Полный код в событии шага мяча теперь следующий:
if fixed=true {x = Bat.x}
if fixed=false {
if dir=0 {
if !place_meeting(x-spd,y-spd,Wall) {x-=spd y-=spd}
}
if dir=1 {
if !place_meeting(x+spd,y-spd,Wall) {x+=spd y-=spd}
}
if dir=2 {
if !place_meeting(x-spd,y+spd,Wall) {x-=spd y+=spd}
}
if dir=3 {
if !place_meeting(x+spd,y+spd,Wall) {x+=spd y+=spd}
}
//Поле влево вверх
if dir=0 && place_meeting(x,y-spd,Wall) {dir=2}
if dir=0 && place_meeting(x-spd,y,Wall) {dir=1}
if dir=0 && place_meeting(x,y-spd,Wall) && place_meeting(x-spd,y,Wall) {dir=3}
//Поле вправо вверх
if dir=1 && place_meeting(x,y-spd,Wall) {dir=3}
if dir=1 && place_meeting(x+spd,y,Wall) {dir=0}
if dir=1 && place_meeting(x,y-spd,Wall) && place_meeting(x+spd,y,Wall) {dir=2}
//Поле влево вниз
if dir=2 && place_meeting(x-spd,y,Wall) {dir=3}
//Поле вправо вниз
if dir=3 && place_meeting(x+spd,y,Wall) {dir=2}
//Отскок от биты
if dir=2 && place_meeting(x-spd,y+spd,Bat) {dir=0}
if dir=3 && place_meeting(x+spd,y+spd,Bat) {dir=1}
}
Запускайте игру и наслаждайтесь отбитием мяча битой. Можете скорость мяча spd в событии создания поменять с 2 на 3, а то он летает очень медленно.
Давайте еще сразу сделаем так, чтобы когда мы не успели отбить мяч и он улетел вниз, за край вида, чтобы комната перезапускалась.
Опять же, у вас уже есть все знания для написания этого кода. Я вам дал все необходимое. Попробуйте сделать это сами. Ну либо просто к коду выше в событии шага мяча просто добавим всего одну строчку:
if y>550 {room_restart()}
Т.е. просто проверяем y координату мяча и если она больше 550, т.е. шар у нас улетел ниже границы уровня (напомню, уровень мы делали высотой в 540 пикселей), то происходит просто перезапуск комнаты.
Думаю, на этом стоит закончить статью, чтобы не растягивать ее сильно. Лучше дам вам время все обдумать, изучить код, немного поиграть с ним, чтобы разобраться окончательно что для чего.
Спасибо, что дочитали статью до конца! Делитесь данной статьей с другими, ставьте лайки, не стесняйтесь задавать вопросы. С удовольствием постараюсь ответить на все. Увидимся в следующей статье. Там мы уже научимся разбивать кирпичи и возможно успеем сделать что-нибудь еще. До встречи!