Обучение Extreme Physics. Первый урок Итак, всем привет. В последнее время все больше и больше накапливается потребность к использованию физики в играх. Спрашивал людей на форуме, но оказалось что всего лишь несколько людей знают физику в Game Maker. Я решил исправить это. Из всех я выбрал
Extreme Physic (EP), т.к. она самая емкая для использования.
В этом уроке мы пройдем самую корочку EP, но и это нам даст уже многое...
Я буду использовать 2.2 версию. Не забывайте, когда создадите новый файл игры, выбрать EP в Extension Package.
Приступим. Прежде всего нужно знать что в EP есть два типа объектов: статический (static) и динамический (dynamic). Статический объект неподвижен, то есть составляет твердую основу, а динамический тот который воздействован разным силам и производит движение на экране. Например, пол в вашем доме можно приставить статическим обьектом, а кружку падающую на пол (необязательно падающию), это динамический объект.
Для удобства мы инициируем свои дополнительные константы
Добавить ресурс => Определить константы
Там пишем:
Имя:
colide1a Переменная:
1;
Имя:
colide1b Переменная:
1;
Имя:
grav Переменная:
0.4И вот мы загружаем два спрайта: статического и динамического объектов и соответствующе называем их:
static и
dynamic. Центрируем спрайты. Пусть спрайт стат. обьекта будет квадрат, а дин. кружок.
Создаем обьект и называем его
systemglobal.world=ep_world_create() // Инициируем физический мир, нужно писать это всегда // global.world - пременная нашего мира
ep_world_set_settings(global.world,1,20,10,0.1,0.5,0,0.5,1); // Устанавливаем глобальные настройки для мира
ep_world_update_contacts(global.world); // Для столкновений в физическом мире
ep_world_simulate_step(global.world); // Что бы "Время не остановилось"
Создаем два скрипта. Один называем
physics_object_set, а второй
physics_object_updateep_body_set_position(global.world,argument0,x,y,degtorad(image_angle));
if !ep_body_is_sleeping(global.world,argument0) {
x = ep_body_get_x(global.world,argument0);
y = ep_body_get_y(global.world,argument0);
image_angle = radtodeg(ep_body_get_rot(global.world,argument0));
}
Создаем два объекта:
static и
dynamic и присваиваем им свои спрайты.
Выбираем обьект
static body = ep_body_create_static(global.world); // Открыто заявляем что это статический объект в нашем мире
shape1 = ep_shape_create_box(global.world,body,sprite_width,sprite_height,0,0,0,1); // Делаем ему квадратную маску размерами своего спрайта
ep_shape_set_collision(global.world,body,shape1,collide1a,collide1b,0); // Пишем о столкновениях с другими объектами
ep_shape_set_material(global.world,body,shape1,0.4,0.4,0,0); // Устанавливаем его характеристики
physics_object_set(body); // Наш скрипт
ep_body_destroy(global.world,body);// Стандартная функция удаления из "мира физического"
В обьекте
dynamicbody = ep_body_create_dynamic(global.world,false); // Динаический объект
shape1 = ep_shape_create_circle(global.world,body,sprite_height/2,0,0,0,1); // Но только теперь это круглая маска размера спрайта
ep_shape_set_collision(global.world,body,shape1,collide1a,collide1b,0); // Столкновения
ep_shape_set_material(global.world,body,shape1,0.4,0.4,0,0); // Характеристики
ep_body_calculate_mass(global.world,body); // Автоподсчет массы и определение доп. характеристик
ep_body_set_gravity(global.world,body,0,grav); // Устанавливаем гравитацию для объекта
physics_object_set(body);
physics_object_update(body);
Снова открываем объект
system instance_create(mouse_x,mouse_y,dynamic) // Что бы мы могли проверить
Расставляем объекты в комнате, не забывая что первым ставим в комнату объект
system, иначе могут быть проблемы с
global.world В ep_world_set_settings(global.world,1,30,30,0.1,0.5,0.1,0.6,1)
worldid - номер физического мира
timestep - время шагов, поможет в изменении скорости игры без изменения скорости комнаты
velocity_iterations - время смещения, время небольшого отклонения в физике
position_iterations - позиция смещении, позиция отклонения
contact_treshold - позволительная позиция залегания на другой объект
baungate_factor - отталкивание от других объектов
mass_bias - сила массы объекта
position_factor - легкость но в тоже время тяжесть в объекте
Мы получили простую физику шариков и ознакомились с основными функциями Extreme Physic
Обязательно по экспериментируете