Я сам совсем недавно ознакомился с Game Maker, но уже появилось то, что хочу вам рассказать. Правда, речь пойдет не о тонкостях GM а всего лишь о том, как организовать баллистическое движение объекта. И в этом нам поможет формула баллистического движения из школьного урока физики
Создадим новый проект и кинем в него 5 спрайтов. Если фон непрозрачен, то каждом спрайте, в окне добавления жмем кнопку «редактировать», затем «Изображение» -> «Стереть цвет», щелкаем на фоновый цвет и двигаем бегунок пока фон не исчезнет.
далее создадим 5 объектов с этими спрайтами и разместим объекты o_wall и o_ball в комнате. Поставим скорость комнаты 100
Далее приступаем к написанию кода. Сначала опишем события для объекта o_ball. Слева кликаем по нему дважды, «События» -> «Клавиатура» -> «<Space>»
справа на вкладе «Control» перетаскиваем «Execute code» в «Действия» (далее будет просто «Добавляем код»), пишем код.
speed = 5 //добавляем скорость direction = point_direction (x, y,o_wall.x, o_wall.y); // направляем шарик на объект o_wall
Также добавим код шарика при столкновении. «События» -> «столкновения» -> «o_wall» и остановим его.
speed = 0
теперь опишем событие для объекта o_wall. Добавим столкновения с шариком o_ball и напишем код
with(instance_create(x,y,o_wall1)) //создаем новый объект – «обломок» o_wall и добавляем разные значения { direction = o_ball.direction + 25 //направление – такое же как у и шара + 25 градусов, чтобы обломки летели в разные стороны x0 = x //запомнаем начальные y0 = y //координаты t = 0 //устанавливаем время но «ноль» } with(instance_create(x,y,o_wall2)) //то же и с другими обломками, только меняем направление { direction = o_ball.direction x0 = x y0 = y t = 0 } with(instance_create(x,y,o_wall3)) { direction = o_ball.direction - 25 x0 = x y0 = y t = 0 } instance_destroy() //уничтожим o_wall
ну и теперь самое главное, в событии «Шага» каждого обломка описываем движение
t += 0.08 //прибавляем время x = ((50 * cos(degtorad(direction))) * t) + x0 //вычисляем новую X координату. «50» - скорость обломка y = ((50 * sin(degtorad(direction))) * t - 9.8 * sqr(t)/ 2) + y0 //Вычисляем Y y = 2 * y0 – y // т.к. координатная ось Y направлена сверху вниз, в отличии от обычного снизу вверх, то изменяем «y» относительно «y0» image_angle += 10 //вертим обломок image_alpha -= 0.008 //даём обломку исчезнуть
Заметьте, что direction берет направление в градусах, поэтому, мы переводим их в радианы функцией «degtorad», для того, чтобы sin и cos правильно вычислились. 9.8 – это константа g – ускорение свободного падения
Пропишем это код во всех объектах обломках.
Теперь запускаем и смотрим что получилось =) вроде неплохо, хотя с большим количеством обломков было бы лучше. Поэкспериментируйте, передвиньте o_ball в другие места и посмотрите, что вышло. Конечно, это можно использовать везде, где вам понадобится баллистическое движение. На этом все. Удачных проектов.
автор: hunteRUS
Отредактировано hunteRUS (2011-01-04 17:41:33)