물리 피xture 바인딩
물리 피xture를 정의한 후, 이를 인스턴스에 바인딩해야 합니다. 바인딩이란 피xture의 속성이 선택된 인스턴스로 전송되는 것을 의미합니다. 실제 피xture 자체가 아니라 속성만 전송되므로, 하나의 피xture를 여러 인스턴스에 바인딩할 수 있습니다. 모든 인스턴스가 동일한 속성을 가질 수 있습니다.
바인딩 방법
- 대상 객체 인덱스 지정: 특정 객체 인덱스를 지정하면, 해당 시점에 방에 있는 모든 인스턴스가 그 피xture의 속성을 받습니다. 단, 이후에 생성된 새로운 인스턴스는 제외됩니다.
- 특수 키워드 사용:
other
와all
키워드를 사용할 수 있습니다. - 부모 객체 지정: 부모 객체를 지정하면 해당 부모의 모든 자식 인스턴스가 피xture를 받을 수 있습니다.
피xture가 필요한 모든 인스턴스에 바인딩된 후에는 더 이상 필요하지 않으면 삭제할 수 있습니다. 이 경우, 바인딩된 인스턴스는 그 피xture의 속성을 유지합니다.
바인딩 위치
피xture는 인스턴스의 질량 중심이 인스턴스의 원점에 위치하도록 바인딩됩니다. 다각형 피xture는 원점에 대한 점의 위치에 따라 바인딩됩니다. 원점이 아닌 다른 지점에 피xture를 바인딩해야 하는 경우, physics_fixture_bind_ext
를 사용해야 합니다.
함수는 바인딩된 피xture에 대한 고유한 "id" 값을 반환합니다. 이 값은 physics_remove_fixture
함수를 사용하여 인스턴스에서 물리적 속성을 제거하는 데 사용될 수 있습니다. 이를 통해 객체를 파괴하거나 재생성하지 않고도 인스턴스에서 물리적 속성을 추가하거나 제거할 수 있습니다.
피xture는 더 이상 필요하지 않을 때 삭제해야 하며, 이를 하지 않으면 메모리 누수가 발생하여 게임이 느려지거나 결국 충돌할 수 있습니다.
문법
physics_fixture_bind(fixture, target)
인수 | 유형 | 설명 |
---|---|---|
fixture | Physics Fixture ID | 바인딩할 피xture |
target | Instance ID 또는 Object Asset | 피xture를 받을 대상 인스턴스 (인스턴스 ID, 객체 ID, other, all 중 하나) |
예제
var fix, inst;
fix = physics_fixture_create();
physics_fixture_set_circle_shape(fix, 16);
physics_fixture_set_density(fix, 1.0);
inst = instance_create_layer(x, y, "Instances", genericBodyObject);
my_fix = physics_fixture_bind(fix, inst);
physics_fixture_delete(fix);
위 코드는 피xture를 생성하고 그 인덱스를 변수 "fix"에 할당합니다. 이후 피xture의 형태와 밀도를 정의한 후, 생성된 인스턴스에 바인딩합니다. 바인딩된 피xture의 인덱스는 변수 "my_fix"에 저장됩니다. 마지막으로, 메모리 누수를 방지하기 위해 더 이상 필요하지 않은 피xture를 삭제합니다.
활용 예제
- 다양한 형태의 피xture 생성:
gml var squareFix; squareFix = physics_fixture_create(); physics_fixture_set_rectangle_shape(squareFix, 32, 32);
- 다양한 밀도 설정:
gml physics_fixture_set_density(squareFix, 0.5);
- 여러 인스턴스에 피xture 바인딩:
gml var inst1, inst2; inst1 = instance_create_layer(x, y, "Instances", genericBodyObject); inst2 = instance_create_layer(x + 50, y, "Instances", genericBodyObject); physics_fixture_bind(squareFix, inst1); physics_fixture_bind(squareFix, inst2);
- 피xture 속성 제거:
gml physics_remove_fixture(my_fix);
- 피xture 삭제:
gml physics_fixture_delete(squareFix);