Проект “Пинг-понг”. Понятие координатной оси
На этом уроке мы сделаем полноценную игру: научимся управлять движением спрайтов с клавиатуры, а также запрограммируем взаимодействие спрайтов друг с другом; узнаем что такое координаты и условный оператор. Всё это мы будем делать на примере игры “Пинг-понг”.
Начнём!
Для начала создадим спрайт “мячика”, который мы должны будем отбивать. Я выбрал спрайт Апельсин (Orange).
Составляем уже известный нам из прошлого урока алгоритм движение мяча по всему экрану.
Добавляем спрайт “ракетки”, которой мы будем отбивать “мячик”. Я выбрал спрайт Хлеб (Bread) и изменил сразу размер этого спрайта до 200%.
Итак, правила нашей игры будут такие: если Апельсин упадет мимо Хлеба, то проигрыш. Мы должны подставлять Хлеб под Апельсин каждый раз, чтобы отбить Апельсин вверх и не дать ему упасть вниз. Управлять Хлебом мы можем клавишами стрелок влево/вправо на клавиатуре.
Реализуем управление Хлебом с клавиатуры. Для этого нам нужно заставить его двигаться влево и вправо. Для того, чтобы понять где находится персонаж и куда он должен двигаться используются координаты на плоскости.
Что же такое координаты? Для наглядности изменим белый фон на Координатную сетку (Xy-grid).
Мы можем разделить экран двумя линиями: одна будет вертикальной – ось У (ось игрек), а другая горизонтальной – ось X (ось икс). Пересекаться эти линии будут в центре экрана. Центр экрана это нулевая точка – от нее ведется отсчет расстояния.
Каждой точке экрана соответствуют две координаты Х и Y.
Координата Х показывает, на сколько шагов левее или правее от центра находится точка. Если точка находится справа от центра экрана, то его координата Х положительная, если точка левее центра, то её координата Х отрицательная. В качестве точки определяющей положение спрайта выбирают центр спрайта.
На рисунке координата X центра Апельсина равна “100“, а координата центра Хлеба равна “-100“.
Координата Y показывает, на сколько шагов выше или ниже от центра находится спрайт. Если спрайт находится выше центра экрана, то его координата Y положительная, если спрайт ниже центра, то его координата Y отрицательная. На рисунке координата Y центра Апельсина равна “50“, а координата Y центра Хлеба равна “-150“.
Если передвигать спрайт вправо, то его координата X увеличивается, а если перемещать влево – уменьшается. Таким образом координата X отвечает за движение влево/вправо. Мы это будем использовать для программирования движения Хлеба.
Выберем спрайт Bread и составим следующий код:
Теперь при каждом нажатии на клавишу стрелка вправо координата Х будет увеличиваться на 10, и Хлеб будет двигаться вправо. А при нажатии на клавишу влево наоборот от координаты X будет уменьшаться на 10 и Хлеб будет двигаться влево.
Пробуем управлять Хлебом влево/вправо. Такой способ работает, но у него есть большой недостаток – это прерывистое движение (дерганье) персонажа. При смене направления движения такая задержка в движении особенно заметна. Такое дерганье происходит из-за того, что операция изменения координаты не помещена внутрь цикла. Поэтому она не повторяется сама по себе, а ждет пока мы снова и снова нажмем на кнопку. В случае если кнопку нажать и не отпускать, компьютер думает, что мы очень быстро нажимаем и отпускаем кнопку (но все равно недостаточно быстро, чтобы избежать рывков).
Поэтому рассмотрим другой способ управления при помощи условной конструкции Если.
Такой способ позволяет поместить условия нажатия кнопки внутрь бесконечного цикла, который не будет прерываться каждый раз, когда мы отпустим кнопку.
Мы использовали в нашем скрипте блок Если. Этот блок называется условным оператором. Все что расположено внутри блока будет выполняться только при выполнении условия, которое записано между словами “если” и “то”.
Обратите внимание, что область условия блока Если имеет форму шестиугольника. Это значит, что блоки только такой формы можно вставить внутрь. Блоки шестиугольной формы расположены в блоках Сенсоры и Операторы.
блоки Сенсоры | блоки Операторы |
В нашей программе Апельсин не отскакивает от Хлеба, а проходит сквозь него. Нужно сделать так, чтобы Апельсин при касании Хлеба отскакивал вверх. В этом нам поможет блок Если.
Собираем конструкцию условия отскока Апельсина вверх при касании Хлеба.
нажав на треугольник, мы открываем выпадающее меню; выбираем Bread | направление поворота вверх соответствует углу равному “0” | вставляем условие внутрь цикла Всегда |
Оказалось, что отскок вверх на “0” градусов может привести к тому, что Апельсин будет прыгать строго вверх и падать строго вниз бесконечно. Игровой интерес теряется. Поэтому можно решить эту проблему изменением угла отскока на “15” градусов вместо “0“.
Теперь нужно будет добавить условия проигрыша. Если Апельсин не оттолкнется от Хлеба, значит он упадет ниже уровня хлеба на пол и игра закончится.
То есть нам необходимо сравнивать положение Апельсина по оси Y. Если положение Апельсина по Y будет ниже какого-то значения (подбирается индивидуально), то мы останавливаем программу.
Нам понадобятся следующие блоки, которые находятся в блоках Операторы, Движение, Контроль.
Составляем условие и подбираем значение положения Y при котором Апельсин упадет ниже уровня Хлеба. Мы видим, что координата Y Апельсина сейчас равна “-154” и он ниже уровня Хлеба.
Значит условие будет таковым: если координата Y будет меньше чем “-154” будем считать, что Апельсин упал на пол и игра проиграна.
Проверяем нашу программу на работоспособность.
Осталось добавить в нашу игру сообщение о проигрыше и задать начальное положение шарика в начале игры. В этом нам помогут блоки движения Перейти в x: y: и блок внешнего вида Сменить фон на.
Задания:
- Если проиграл, то фон сменяется на фон с надписью Игра окончена.
- При запуске программы фон снова становится игровым.
- Подберите скорость и угол поворота Апельсина для удобной игры.
- Добавьте звук при ударе Апельсина о Хлеб.
- Добавьте звук при проигрыше.
- Добавьте возможность играть вдвоем. Второй игрок может двигаться по верхнему краю экрана и отбивать мячик вниз.