Понедельник, 09 Декабря 2024, 10:04

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Изменение 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(). Можно попробовать менять тип маски на боксовую или любую, а сразу после менять обратно на полигоновую т.к. сенсор у маски можно назначать только после установки координат. Может я ещё чего-то из справки не знаю? blink

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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг