Обучение Extreme Physics. Второй урок Перед этим уроком вам следует прочитать первыйВообще-то в этом уроке должно быть гораздо больше чем написано. К большому сожалению потерял первую часть урока, где рассказывал про формы (shape), так что пока расскажу про то как сделать хватающиеся кубики.
Итак, как и раньше
Добавить ресурс => Определить константы
Имя:
usedebugdraw Переменная:
trueИмя:
collide1a Переменная:
1Имя:
collide1b Переменная:
1Теперь создаем обьект
system и комнату. Что бы не забыть сразу помещаем его туда и в нем
долго пишем:
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;// Перменная захвата
// Математика? неееееееет)
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); // И вот устанавливаем точку взятия
// Всегда
ep_world_update_contacts(global.world);
ep_world_simulate_step(global.world);
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); // Максимальная сила связи
}
}
// Итак для всех остальных
if mousehingejoint!=-1 { // Если взят как либо обьект
ep_hingejoint_destroy(global.world,mousehingejoint); // Уничтожаем связь
mousehingejoint = -1; // Приходим в норму
}
Загружаем два спрайта статистического и динамического обьекта с названиями:
static и
block1 (помним, что центрируем спрайты). Пусть оба спрайта будут квадраты 32*32px.
Создаем два обьекта с такими же названиями...
В
static пишем знакомый код:
// Стандарт
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)); // И зачем мы тогда делали эти скрипты?
ep_body_destroy(global.world,body); // Убиваем
В
block1// Обычно
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));
ep_body_destroy(global.world,body); // Пиф
// Висим там где надо
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)); // Незабываем про угол
Так же сделайте с другими обьектами (в примере показал). Сохраните эту заготовку и всегда будете делать просто - по анологии.
Ну, теперь можно поиграться этими кубиками. И постарайтесь наизусть запомнить коды