Изменение Collision Shape объекта, использующего физику
| |
Skrininshot | Дата: Вторник, 15 Мая 2018, 16:25 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Привет. Делаю платформер,впервые используя встроенную физику Game maker. Столкнулся с такой проблемой, что при некоторых обстоятельствах требуется изменять collision shape объекта, чего я понятия не имею как делать. Есть подозрения, что всё завязано на physics_fixture_set_box_shape подскажите чё делать пожалуйста
What is love Baby don't hurt me Don't hurt me No more...
Сообщение отредактировал Skrininshot - Вторник, 15 Мая 2018, 16:30 |
|
| |
Abel399 | Дата: Четверг, 17 Мая 2018, 18:19 | Сообщение # 2 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Верные подозрения, но справку видимо прочитали плохо.
CollisionShape можно менять через physics_fixture_bind и physics_fixture_bind_ext. Далее бывают следующие типы масок: * physics_fixture_set_box_shape - прямоугольник * physics_fixture_set_circle_shape - окружность * physics_fixture_set_edge_shape - отрезок (удобен, например, для ровных поверхностей) * physics_fixture_set_chain_shape - веревка/цепь из edge'ей * physics_fixture_set_polygon_shape - произвольный многоугольник
Ну, работает это примерно так:
Код var ox, oy, fix; ox = sprite_xoffset; oy = sprite_yoffset; fix = physics_fixture_create(); physics_fixture_set_polygon_shape(fix, 24, 24); physics_fixture_add_point(fix, 0 - ox, 64 - oy); physics_fixture_add_point(fix, 24 - ox, 8 - oy); physics_fixture_add_point(fix, 48 - ox, 64 - oy); physics_fixture_bind(fix, self); physics_fixture_delete(fix);
Напоследок вот полезный видеоурок по физическим маскам (fixtures).
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
Skrininshot | Дата: Четверг, 17 Мая 2018, 19:14 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Abel399, К этому времени ознакомился с ficture'ами получше, теперь вопрос немного иной, но суть та же. Когда персонаж присаживается на корточки я мечтаю о том, чтобы вместе с этим действием менялась и его физическая маска, но вместо того, чтобы заменить предыдущую, создается поверх новая (как я совсем недавно догадался). В степе, когда сажусь создается маска, ей назначаются координаты краёв и она удаляется, то же самое происходит, когда персонаж встаёт. UPD1: Вот, чёрт. Я их не привязывал к игроку UPD2: Изменил приведённый ниже код, добавил physics_fixture_bind() для правдоподобности. Проблема ещё в силе, игрок продолжает биться невидимой головой об стену впереди, находясь в это время на корточках. Получается, что физическая маска почему-то не менялась в Create:
Код fix = physics_fixture_create() physics_fixture_set_polygon_shape(fix)
physics_fixture_add_point(fix,9,-20)//righttop physics_fixture_add_point(fix,9,20)//rightbottom physics_fixture_add_point(fix,-9,20)//leftbottom physics_fixture_add_point(fix,-9,-20)//lefttop
physics_fixture_set_density(fix,2) physics_fixture_set_restitution(fix,0.1) physics_fixture_set_collision_group(fix,0) physics_fixture_set_linear_damping(fix,0.5) physics_fixture_set_angular_damping(fix,0.1) physics_fixture_set_friction(fix,3) physics_fixture_bind(fix,self) physics_fixture_delete(fix)
В Step:
Код if kd { if couch = false { fix = physics_fixture_create() physics_fixture_set_polygon_shape(fix)
physics_fixture_add_point(fix,9,-10)//righttop physics_fixture_add_point(fix,9,18)//rightbottom physics_fixture_add_point(fix,-9,18)//leftbottom physics_fixture_add_point(fix,-9,-10)//lefttop physics_fixture_bind(fix,self)
physics_fixture_delete(fix) couch = true } } else { if couch = true { fix = physics_fixture_create() physics_fixture_set_polygon_shape(fix)
physics_fixture_add_point(fix,9,-20)//righttop physics_fixture_add_point(fix,9,18)//rightbottom physics_fixture_add_point(fix,-9,18)//leftbottom physics_fixture_add_point(fix,-9,-20)//lefttop physics_fixture_bind(fix,self)
physics_fixture_delete(fix) couch = false } }
скрины для лучшего понимания проблемы (делал для англоязычного форума)
What is love Baby don't hurt me Don't hurt me No more...
Сообщение отредактировал Skrininshot - Четверг, 17 Мая 2018, 19:42 |
|
| |
Abel399 | Дата: Четверг, 17 Мая 2018, 21:46 | Сообщение # 4 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Опять же невнимательно читали справку: physics_remove_fixture
Делаете так - создаете в Create default_fix и couch_fix, не удаляете их. В Step сперва удаляете предыдущую маску, потом биндите новую. Должно работать.
P.S> Под удалением я имел ввиду "unbind / remove" P.S> Не знаю как реализована операция "отлинковать маску", насколько это дешевая операция, но как альтернатива есть еще physics_fixture_set_sensor. Добавляете сразу обе маски, но одну из них делаете сенсором (события коллизии есть, физики нет). После этого просто переключаете необходимые маски на объекте.
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Четверг, 17 Мая 2018, 21:52 |
|
| |
Skrininshot | Дата: Пятница, 18 Мая 2018, 18:46 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Abel399, как я опять же выяснил, сенсором маска становится только если писать это сразу после назначения координат точек (в моём случае у полигоновой маски). Теперь я могу на что-то повлиять только через create, если же напишу в степе physics_fixture_set_sensor(sfix,0), то ничего не изменится и игрок на корточках продолжит биться пустым пространством об стену. Так же я пробовал удалять одну и создавать другую, но они попросту не удаляются вообще никак. Ещё одно подозрение - physics_fixture_set_box_shape(). Можно попробовать менять тип маски на боксовую или любую, а сразу после менять обратно на полигоновую т.к. сенсор у маски можно назначать только после установки координат. Может я ещё чего-то из справки не знаю?
Create
Код ///couch shape cfix = physics_fixture_create() physics_fixture_set_polygon_shape(cfix)
physics_fixture_add_point(cfix,9,-10)//righttop physics_fixture_add_point(cfix,9,20)//rightbottom physics_fixture_add_point(cfix,-9,20)//leftbottom physics_fixture_add_point(cfix,-9,-10)//lefttop
physics_fixture_set_density(cfix,2) physics_fixture_set_restitution(cfix,0.1) physics_fixture_set_collision_group(cfix,0) physics_fixture_set_linear_damping(cfix,0.5) physics_fixture_set_angular_damping(cfix,0.1) physics_fixture_set_friction(cfix,3) physics_fixture_bind(cfix,self)
///standing shape sfix = physics_fixture_create() physics_fixture_set_polygon_shape(sfix)
physics_fixture_add_point(sfix,9,-20)//righttop physics_fixture_add_point(sfix,9,20)//rightbottom physics_fixture_add_point(sfix,-9,20)//leftbottom physics_fixture_add_point(sfix,-9,-20)//lefttop physics_fixture_set_sensor(sfix,0) physics_fixture_bind(sfix,self)
Step
Код if kd { if couch = false { physics_fixture_set_sensor(sfix,1) couch = true } } else { if couch = true { physics_fixture_set_sensor(sfix,0) couch = false } }
(Сделал всё немного иначе, что не пришлось прибегать к маскам, но проблему, связанную с ними, не смог решить)
What is love Baby don't hurt me Don't hurt me No more...
Сообщение отредактировал Skrininshot - Суббота, 19 Мая 2018, 20:30 |
|
| |
|