Посетите Satan's cry

Game Maker People.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Game Maker People. » Статьи и Уроки » Баллистическое движение


Баллистическое движение

Сообщений 1 страница 4 из 4

1

Я сам совсем недавно ознакомился с Game Maker, но уже появилось то, что хочу вам рассказать. Правда, речь пойдет не о тонкостях GM а всего лишь о том, как организовать баллистическое движение объекта. И в этом нам поможет формула баллистического движения из школьного урока физики ;)

Создадим новый проект и кинем в него 5 спрайтов. Если фон непрозрачен, то каждом спрайте, в окне добавления жмем кнопку «редактировать», затем «Изображение» -> «Стереть цвет», щелкаем на фоновый цвет и двигаем бегунок пока фон не исчезнет.

http://s008.radikal.ru/i305/1101/20/470f6d6cba34.jpg

далее создадим 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 в другие места и посмотрите, что вышло. Конечно, это можно использовать везде, где вам понадобится баллистическое движение. На этом все. Удачных проектов.

http://s43.radikal.ru/i102/1101/1e/3f6c79b2f10f.jpg

автор: hunteRUS

Скачать пример

Отредактировано hunteRUS (2011-01-04 17:41:33)

0

2

Неплохо=)
Но!=)
Лучше сделать в мячике(Пробел),Вот так:

Код:
if instance_exists(o_wall){
speed = 5
direction = point_direction (x, y,o_wall.x, o_wall.y);}

А так неплохой, простой пример) :cool: :cool: :cool:
Лови Плюсик

0

3

Ну, мой код не гарантирует стопроцентной выполняемости при различных условиях, поэтому никаких проверок я и не писал =) обычно я их пишу

0

4

Ну ясно=3

0


Вы здесь » Game Maker People. » Статьи и Уроки » Баллистическое движение