GameMaker 日本語掲示板

フィクスチャの設定方法

2 コメント
views
16 フォロー

obj_ballとobj_boxにそれぞれに違う反発係数を与え、マウスをクリックするとroomに生成される、というコードを描きたかったのですが、反発係数を与えられません。具体例は、obj_ball内の作成イベントのphysics_fixture_set_restitution(fix_ball,0.9);  が機能してくれない、などです。いろいろ試行錯誤をしてみると、physics_set_restitution(obj_ball,0.9);  とすると、obj_ballに反発係数を与えることができましたが、文法的には違うし、同じようにobj_boxもこの関数でコードを書いても、physics_set_restitution(obj_box,0.9); obj_boxには反発係数を与えることができませんでした。なぜ、fixtureで反発係数を設定し、obj_ballなどに定義させることができないのか、どうやったら正しく反発係数を与えられるのか、fixtureとbindの詳しい仕組みについて教えていただきたいです。稚拙な文章で読みづらいと思いますが、どうかよろしくお願いします。画像1
画像2
画像1

どすこいさん
作成: 2024/06/22 (土) 11:24:21
最終更新: 2024/06/22 (土) 11:29:36
通報 ...
1
生高橋 2024/06/24 (月) 09:16:36

Uses Physicsにチェックが入ってるとオブジェクト側で設定したfixtureがバインドされます。
そこから新たにコード上で用意したfixtureをバインドすると二つのfixtureがバインドされた状態になります。
fixtureは複数バインドすることが可能ですので現状だと複数のfixtureがバインドされている状態になっていると予想します。
どうしても、コード上で独自に用意したfixtureを用意する場合はUses Physicsのチェックを外し、物理変数を全部指定しないといけないっぽいです。
めんどくさいですが、次のようにするとよいかもしれません。

var fixture = physics_fixture_create();
physics_fixture_set_box_shape(fixture,32,32);
physics_fixture_set_density(fixture,0.5);
physics_fixture_set_restitution(fixture,0.5);
physics_fixture_set_collision_group(fixture,1);
physics_fixture_set_linear_damping(fixture,0.1);
physics_fixture_set_angular_damping(fixture,0.1);
physics_fixture_set_friction(fixture,0.2);
physics_fixture_bind(fixture,self);
physics_fixture_delete(fixture);

また、set_restitutionにはややこしいですが二つの関数があります。
・physics_fixture_set_restitution
・physics_set_restitution

physics_fixture_set_restitutionは上の例のように作成したfixtureのrestitutionを変更する関数です。
physics_set_restitutionはすでにバインドされたfixtureのrestitutionを変更する関数です。
physics_set_restitutionの使い方は次の通りです。

var fixture = physics_fixture_create();
physics_fixture_set_box_shape(fixture,16,16);
physics_fixture_set_density(fixture,0.5);
physics_fixture_set_restitution(fixture,0.5);
physics_fixture_set_collision_group(fixture,1);
physics_fixture_set_linear_damping(fixture,0.1);
physics_fixture_set_angular_damping(fixture,0.1);
physics_fixture_set_friction(fixture,0.2);
var bindFixture = physics_fixture_bind(fixture,self);
physics_fixture_delete(fixture);

physics_set_restitution(bindFixture,0.1)

physics_fixture_bindの戻り値を利用してバインドされたfixtureを取得し、そのfixtureのrestitutionを変更します。
バインド済みなので再バインドする必要がありません。

2
どすこいさん 2024/06/25 (火) 17:07:10

詳しい解説ありがとうございます!解決しました!