Найти в Дзене
Сделай игру

Обрабочик столкновений. День первый.

Оглавление

Привет. Это снова он, обработчик столкновений. Тут, в общем, такая история приключилась: я долго пытался сделать обработчик столкновений, потом сделал его и перешёл на обработку разных второстепенных функциональностей и совершенно потерял из виду основную цель - написание игрушки. В планах были гоночки, но там был набор некоторого количества задач, которые не решались сходу.

Поэтому я решил съесть этого слона по кусочкам. Это будет небольшая демонстрация, в которой я постепенно буду, шаг за шагом, реализовывать основные механики.

Короче говоря, будет падать шарик и на пути встречаться с разными препятствиями. Препятствия бывают двух типов: тормозящие и блокирующие. Задача - как можно скорее долететь до нижней границы карты. Препятствия появляются в случайном порядке. Также есть динамические препятствия, которые двигаются.

Задача отработать следующие действия:

  1. Прокрутка экрана при движении;
  2. Набор скорости и торможение (столкновение со статичными объектами);
  3. Управление объектом, полная остановка при некоторых столкновениях и временная смена направления движения;
  4. Столкновение с динамичными препятствиями (изменчивые координаты);
  5. Подсчёт очков.

Пока это основное. По ходу дела, добавится ещё что-нибудь.

Прокрутка при движении

Пока просто отрисуем карту. Она будет генерироваться автоматически; по краям - границы. Также попробуем прокрутить её вниз.

Белое - препятствия, фиолетовое - замедляющие препятствия, красное - герой, голубое - динамичный противник
Белое - препятствия, фиолетовое - замедляющие препятствия, красное - герой, голубое - динамичный противник

Объект - красный шарик, показывается в самом верху и начинает движение вниз. В процессе, он начинает своё падение наверху экрана, потом добирается до середины (по вертикали) и, пока вся карта не будет полностью прокручена вниз - находится примерно по середине. Но когда нижний край экрана совпадает с нижним краем карты - прокрутка прекращается и шарик падает уже до нижней границы экрана.

Звучит немного запутанно. Но выглядит примерно так:

Ускоренное падение с прокруткой
Ускоренное падение с прокруткой

Тут я немного смухлевал: сделал падение не особо понятным для пользователя, да и шарик в самом конце улетает далеко за границы экрана. Это непорядок. Надо, чтобы всё заканчивалось смачным шлепком об пол. Сделаю. Это уже пустяки.

Можно объявить, что первый этап выполнен: экран прокручивается. Пора перейти к следующему.

Набор скорости и торможение

Тут всё немного сложней: теперь потребуется как-то поработать с вопросом первичных столкновений.

Набор скорости будет осуществляться засчёт ускорения свободного падения - скорость будет набираться постепенно и не будет превышать некоторого разумного предела (скажем, 600 пикселей в секунду). Может быть стоит сделать поменьше, пока не знаю.

Формула скорости такая: V = √g*S. Читается: скорость равна квадратному корню из ускорения свободного падения (9,8 м/c2) помноженной на пройденный путь. Привет, физика за 9 класс.

Я немного поигрался расстоянием, чтобы слишком быстро скорость не набиралась. При столкновении с препятствиями - назначается штраф: либо урезается скорость, либо сбрасывается пройденное расстояние (что равноценно остановке).

Наступает первый сложный этап - столкновение со статичными объектами.

Решение будет реализовываться в два этапа: во-первых, добавим возможность управлять шариком мышкой, чтобы он мог перемещаться по горизонтали. Во-вторых, при столкновении с объектом, пока что, объект будем стирать, чтобы понимать, что столкновение отрабатыватеся.

Ранее, в блоге я писал про способы обработки столкновений. Кто не читал - прошу сюда. Право, я настаиваю. Перейдите, прочтите, поднимите мне конверсию. Не очень понимаю, зачем все эти цифры в статистике и что они дают, но когда они растут - возникает чувство, сравнимое с получением достижения (ака ачивки) в игрушке.

Но продолжим. Нам понадобится раздел простое пересечение. Если коротко, то у каждого статичного объекта на карте - есть фиксированные координаты и, как следствие, индекс (я использую линейный массив, а не матрицу; это имеет свои плюсы и минусы; главный плюс - я так редко делаю и стало интересно попробовать, как это будет в работе).

Наш герой-шарик имеет 4 точки - углы коробочки. Каждый угол - точка. Каждую точку - можно пересчитать в индекс массива. Если по указанному адресу ничего нет - значит всё норм, продолжаем. А если что-то находится - значит столкновение - обрабатываем.

Рабочая версия определение попадания углов в неприличные адреса массива
Рабочая версия определение попадания углов в неприличные адреса массива

Ну... простенькое управление стало быть. Двигаем мышкой с зажатой левой кнопкой по экрану - шарик перемещается (довольно шустро, потом, для усложнения, можно замедлить). Выглядит примерно так:

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

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

Ещё хотелось бы кодом поделиться, но пока не совсем понятно, как это сделать. Поэтому вот вам пока картиночку:

Практически основной код управления испытательным стендом
Практически основной код управления испытательным стендом