Привет. Это снова он, обработчик столкновений. Тут, в общем, такая история приключилась: я долго пытался сделать обработчик столкновений, потом сделал его и перешёл на обработку разных второстепенных функциональностей и совершенно потерял из виду основную цель - написание игрушки. В планах были гоночки, но там был набор некоторого количества задач, которые не решались сходу.
Поэтому я решил съесть этого слона по кусочкам. Это будет небольшая демонстрация, в которой я постепенно буду, шаг за шагом, реализовывать основные механики.
Короче говоря, будет падать шарик и на пути встречаться с разными препятствиями. Препятствия бывают двух типов: тормозящие и блокирующие. Задача - как можно скорее долететь до нижней границы карты. Препятствия появляются в случайном порядке. Также есть динамические препятствия, которые двигаются.
Задача отработать следующие действия:
- Прокрутка экрана при движении;
- Набор скорости и торможение (столкновение со статичными объектами);
- Управление объектом, полная остановка при некоторых столкновениях и временная смена направления движения;
- Столкновение с динамичными препятствиями (изменчивые координаты);
- Подсчёт очков.
Пока это основное. По ходу дела, добавится ещё что-нибудь.
Прокрутка при движении
Пока просто отрисуем карту. Она будет генерироваться автоматически; по краям - границы. Также попробуем прокрутить её вниз.
Объект - красный шарик, показывается в самом верху и начинает движение вниз. В процессе, он начинает своё падение наверху экрана, потом добирается до середины (по вертикали) и, пока вся карта не будет полностью прокручена вниз - находится примерно по середине. Но когда нижний край экрана совпадает с нижним краем карты - прокрутка прекращается и шарик падает уже до нижней границы экрана.
Звучит немного запутанно. Но выглядит примерно так:
Тут я немного смухлевал: сделал падение не особо понятным для пользователя, да и шарик в самом конце улетает далеко за границы экрана. Это непорядок. Надо, чтобы всё заканчивалось смачным шлепком об пол. Сделаю. Это уже пустяки.
Можно объявить, что первый этап выполнен: экран прокручивается. Пора перейти к следующему.
Набор скорости и торможение
Тут всё немного сложней: теперь потребуется как-то поработать с вопросом первичных столкновений.
Набор скорости будет осуществляться засчёт ускорения свободного падения - скорость будет набираться постепенно и не будет превышать некоторого разумного предела (скажем, 600 пикселей в секунду). Может быть стоит сделать поменьше, пока не знаю.
Формула скорости такая: V = √g*S. Читается: скорость равна квадратному корню из ускорения свободного падения (9,8 м/c2) помноженной на пройденный путь. Привет, физика за 9 класс.
Я немного поигрался расстоянием, чтобы слишком быстро скорость не набиралась. При столкновении с препятствиями - назначается штраф: либо урезается скорость, либо сбрасывается пройденное расстояние (что равноценно остановке).
Наступает первый сложный этап - столкновение со статичными объектами.
Решение будет реализовываться в два этапа: во-первых, добавим возможность управлять шариком мышкой, чтобы он мог перемещаться по горизонтали. Во-вторых, при столкновении с объектом, пока что, объект будем стирать, чтобы понимать, что столкновение отрабатыватеся.
Ранее, в блоге я писал про способы обработки столкновений. Кто не читал - прошу сюда. Право, я настаиваю. Перейдите, прочтите, поднимите мне конверсию. Не очень понимаю, зачем все эти цифры в статистике и что они дают, но когда они растут - возникает чувство, сравнимое с получением достижения (ака ачивки) в игрушке.
Но продолжим. Нам понадобится раздел простое пересечение. Если коротко, то у каждого статичного объекта на карте - есть фиксированные координаты и, как следствие, индекс (я использую линейный массив, а не матрицу; это имеет свои плюсы и минусы; главный плюс - я так редко делаю и стало интересно попробовать, как это будет в работе).
Наш герой-шарик имеет 4 точки - углы коробочки. Каждый угол - точка. Каждую точку - можно пересчитать в индекс массива. Если по указанному адресу ничего нет - значит всё норм, продолжаем. А если что-то находится - значит столкновение - обрабатываем.
Ну... простенькое управление стало быть. Двигаем мышкой с зажатой левой кнопкой по экрану - шарик перемещается (довольно шустро, потом, для усложнения, можно замедлить). Выглядит примерно так:
Ну вот, первый этап готов. Далее надо сделать так, чтобы ударяясь о препятствия шарик либо притормаживался, либо вовсе останавливался и сильно замедлялся в управлении. Но это уже позже.
Ещё хотелось бы кодом поделиться, но пока не совсем понятно, как это сделать. Поэтому вот вам пока картиночку: