Как добавить физику на game maker'e Здравствуйте! Меня уже больше года не было на GCUP и, зайдя на сайт, я увидел, что начался конкурс по разработки физических игр. Так как, наверное, у многих возникла потребность написать физическую игру, я решил написать статью по теме разработки физических игр на Game maker. Многие думают, что физика на Game maker, это как Crysis 3 на ЭВМ, на самом деле это далеко не так. Не сочтите за рекламу, я использую библиотеку Extrime Physics. Вот ссылка на библиотеку: http://gm-files.ru/downloads.php?page_id=3309 Это будет небольшой туториал по библиотеке, для тех, кто в ней полнейший чайник (но хотя-бы как то знает GML). Итак, начнём с самых основ, затем приступим к написанию скриптов. Существует 2 типа объектов - Статический и Динамический. Статический тип объектов - тип, который будет так сказать "курить в сторонке» (пол), а если точнее твёрдая основа. Динамический тип - тип, который будет поддаваться законам физики (мячик). Вначале определим 3 константы (кто не знает - Добавить ресурс ->определить константы). Первая константа colide1a со значением 1, вторая colide1b тоже со значением 1,третья grav со значением 0.4. Итак, в этом туториале мы рассмотрим и статические, и динамические объекты. Загружаем спрайты статического и динамического объекта, называем их spr_static и spr_dinamic. Далее, создаём основной объект(obj_system,obj_controll, называйте, как хотите, в тексте это будет просто system). В событии Create пишем следующий код:
Код
global.world=ep_world_create() // Создание физического мира. Гл. переменная world - наш мир. ep_world_set_settings(global.world,1,20,10,0.1,0.5,0,0.5,1); // Это функция настройки. Подробно ниже.
Думаю с первой строчой всё слишком понятно. Со второй посложнее. Итак, 1 аргумент - переменная нашего мира (та самая первая строчка) Второй - время шагов, это то же самое что и room_speed, только с физическим миром. Третий - так называемое время смещения, время небольшого отклонения в физике Четвёртый - позиция смещения, позиция отклонения Пятый - позволительная позиция залегания на другой объект Шестой - отталкивание от других объектов Седьмой - сила массы объекта Восьмой - легкость, но в тоже время тяжесть в объекте Вспоминаем уроки физики, они вам пригодятся. Ладно. Создаём событие Step в том же объекте и идём дальше, вставляем код:
Step, отвечает за обновление параметров физики. 1 Строчка обновление столкновений, в качестве аргумента принимает нашу переменную с миром, вторая строчка за обновление время. Итак, покидаем наш объект sytem, создаём два скрипта: physics_object_update и physics_object_set. По названию понятно - physics_object_set(object) - присвоение объекту физики. physics_object_update(object) - обновление объекта Итак пишем в physics_object_set:
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)); }
Итак, пришёл торжественный момент, создаём наш динамические и статические объекты. Называем их по любому, присваиваем спрайты (я человек простой, называю их типично: obj_static и obj_dynamic, присваиваем им спрайты). В create у статического пишем:
Код
body = ep_body_create_static(global.world); // Body - это наш объект, мы указываем, что он статический. 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); // Узнаёте?
В destroy:
Код
ep_body_destroy(global.world,body);// Удаляем объект из мира(принимает в качестве аргумента мир и наш объект)
Итак, со статическим кончено. Теперь динамический. В create пишем:
Код
body = 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);
И осталось только обновлять этот объект в End Step:
Код
physics_object_update(body); //Узнаёте?!!!
Итак, поздравляю, вы постигли основы. Теперь нам надо призывать объект на глобальный левый клик мышки (что может быть проще), в system при нажатии на левую кнопку пишем:
Код
instance_create(mouse_x,mouse_y,dynamic)
ВСЁ! Не забываем поставить sytem в первую очередь, поставить статические объекты(пол) и самый простой физический эксперимент готов!
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Как добавить в игру физику на game maker?», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Да согласен, можно не то что в два раза можно во много раз это решить, но данная статья является обзором базовых функций и возможностей библиотеки Extrime Physics.
1)исходники примера? 2)вы или библиотека решаете проблему того, что при столкновении объекты останавливаются не вплотную, а на расстоянии друг от друга?
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]