Game Maker - создание игр | HellRoom Games

Game Maker | GameMaker: Studio [Game-Maker.ru] => Статьи / уроки => Тема начата: lucheus от Март 27, 2012, 09:42:16



Название: Обучение Extreme Physics. Второй Урок.
Отправлено: lucheus от Март 27, 2012, 09:42:16
Обучение Extreme Physics. Второй урок
Перед этим уроком вам следует прочитать первый (http://forum.hellroom.ru/index.php?topic=9180.msg98683#msg98683)
Вообще-то в этом уроке должно быть гораздо больше чем написано. К большому сожалению потерял первую часть урока, где рассказывал про формы (shape), так что пока расскажу про то как сделать хватающиеся кубики.
Итак, как и раньше
Добавить ресурс => Определить константы
Имя: usedebugdraw Переменная: true
Имя: collide1a Переменная: 1
Имя: collide1b Переменная: 1
Теперь создаем обьект system и комнату. Что бы не забыть сразу помещаем его туда и в нем долго пишем:
Код: (create)
global.world = ep_world_create(); // Мир
ep_world_set_settings(global.world,1,30,20,0.1,0.5,0.002,0.6,0.8); // Настройки
ep_world_set_sleeping(global.world,true,60,0,0.01,0.001)// Спять
mousebody = ep_body_create_static(global.world); // Исскуственный обьект на мышке
mousehingejoint = -1;// Перменная захвата
Код: (step)
// Математика? неееееееет)
var vx,vy,d; // Перменные
vx = 1*(mouse_x-ep_body_get_x_center(global.world,mousebody)); //Хватаем за нужную часть x
vy = 1*(mouse_y-ep_body_get_y_center(global.world,mousebody));  //Хватаем за нужную часть y
if mousehingejoint!=-1 { // Если можно взять
d = sqrt(vx*vx+vy*vy); // Бла-бла-бла // Гравитация
if d>10 {
vx *= 10/d;
vy *= 10/d;
}
}
ep_body_set_velocity_center(global.world,mousebody,vx,vy,0); // И вот устанавливаем точку взятия
Код: (end step)
// Всегда
ep_world_update_contacts(global.world);
ep_world_simulate_step(global.world);
Код: (glob left pressed)
var xx,yy;// Переменные
with block1 { // Для block1
xx = ep_body_coord_world_to_local_x(global.world,body,mouse_x,mouse_y); // Ищем прошлую x точку
yy = ep_body_coord_world_to_local_y(global.world,body,mouse_x,mouse_y); // Ищем прошлуюy точку
if -16<xx and xx<16 and -16<yy and yy<16 { // Если мы в форме обьекта. Половину спрайта вместо 16 пишите
other.mousehingejoint = ep_hingejoint_create(global.world,body,other.mousebody,xx,yy,0,0,0);// Устанавливаем связь
ep_hingejoint_set_max_force(global.world,other.mousehingejoint,10000); // Максимальная сила связи
}
}

// Итак для всех остальных
Код: (glob left released)
if mousehingejoint!=-1 { // Если взят как либо обьект
ep_hingejoint_destroy(global.world,mousehingejoint); // Уничтожаем связь
mousehingejoint = -1; // Приходим в норму
}

Загружаем два спрайта статистического и динамического обьекта с названиями: static и block1 (помним, что центрируем спрайты). Пусть оба спрайта будут квадраты 32*32px.
Создаем два обьекта с такими же названиями...
В static пишем знакомый код:
Код: (create)
// Стандарт
body = ep_body_create_dynamic(global.world,false);
shape1 = ep_shape_create_box(global.world,body,32,32,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,0.2);
ep_body_set_position(global.world,body,x,y,degtorad(image_angle)); // И зачем мы тогда делали эти скрипты?
Код: (destroy)
ep_body_destroy(global.world,body); // Убиваем

В block1
Код: (create)
// Обычно
body = ep_body_create_dynamic(global.world,false);
shape1 = ep_shape_create_box(global.world,body,32,32,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,0.2);
ep_body_set_position(global.world,body,x,y,degtorad(image_angle));
Код: (destroy)
ep_body_destroy(global.world,body);  // Пиф
Код: (end step)
// Висим там где надо
x = ep_body_get_x(global.world,body);
y = ep_body_get_y(global.world,body);
image_angle = radtodeg(ep_body_get_rot(global.world,body)); // Незабываем про угол

Так же сделайте с другими обьектами (в примере показал). Сохраните эту заготовку и всегда будете делать просто - по анологии.

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


Название: Re: Обучение Extreme Physics. Второй Урок.
Отправлено: t111 от Август 31, 2013, 16:06:39
слушай, а можешь написать как сделать имитацию вылета ядра из пушки. Чтобы ядро было физический объект и при нажатии на пушку-вылетало из пушки?


Название: Re: Обучение Extreme Physics. Второй Урок.
Отправлено: CrazyPony от Декабрь 05, 2014, 18:21:15
А как можно сделать, чтобы объект тянулся в сторону при нажатии на клавишу?