Game Maker - создание игр | HellRoom Games
Январь 14, 2025, 09:01:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обучение Extreme Physics. Второй Урок.  (Прочитано 12070 раз)
0 Пользователей и 1 Гость смотрят эту тему.
lucheus
Free Bird
«Старожил форума»
******

Репутация: 81
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [50 дней на форуме]
API: GameMaker Studio 2
Деятельность: Игростроение, дизайн, музыка, ролики и т.п
Сообщений: 769


« : Март 27, 2012, 09:42:16 »

Обучение Extreme Physics. Второй урок
Перед этим уроком вам следует прочитать первый
Вообще-то в этом уроке должно быть гораздо больше чем написано. К большому сожалению потерял первую часть урока, где рассказывал про формы (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)); // Незабываем про угол

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

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

* firstEP2.gmk (13.08 Кб - загружено 991 раз.)
« Последнее редактирование: Май 18, 2012, 04:47:12 от lucheus » Записан

"Глина, из которой ты слеплен, высохла и затвердела, и уже ничто и никто на свете не сумеет пробудить в тебе уснувшего музыканта или поэта, или астронома, который, быть может, жил в тебе когда-то" (с) Антуан де-Сент Экзюпери

t111
Посетитель
**

Репутация: -1
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 20


« Ответ #1 : Август 31, 2013, 16:06:39 »

слушай, а можешь написать как сделать имитацию вылета ядра из пушки. Чтобы ядро было физический объект и при нажатии на пушку-вылетало из пушки?
Записан
CrazyPony
Посетитель
**

Репутация: 0
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 15


« Ответ #2 : Декабрь 05, 2014, 18:21:15 »

А как можно сделать, чтобы объект тянулся в сторону при нажатии на клавишу?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.166 секунд. Запросов: 29.