タイトルが示すように、ゲームメーカーで継続的に再スポーンする(現在はx軸上のランダムな位置に設定されている)オブジェクトが互いに重なり合うのを防ぐ正しい方法を知っている人はいますか?
2 に答える
再生成オブジェクトのCreateイベントにチェックを追加できます。このイベントはplace_meeting(x,y,object_index)
、同じオブジェクトタイプの別のインスタンスと交差するかどうかをチェックするために使用されます。もしそうなら、あなたは別の位置を設定してみることができます。
インスタンスを生成するコードでこれを行うこともできます。最初にインスタンスを作成し、次に適切な場所が見つかるまでランダムな場所をテストします。
newinst = instance_create(0,spawnY,object0);
with(newinst) {
var tries, done;
tries = 0;
done = false;
do {
tries += 1;
x = irandom(room_width);
done = !place_meeting(x,y,object_index);
} until(done or tries>50);
if(not done) {
// not enough space (or bad luck), bail out
instance_destroy();
}
}
「試行」制限は、使用可能なスペースがない場合に無限ループに陥らないようにすることを目的としています。この方法は、ほとんどのスペースが使用されると予想される場合は効率的ではなく、実際に使用可能なスペースがあるときに失敗する可能性があります(また、すでに多くのインスタンスが邪魔をしている場合)、これが問題である場合は、さらに多くのスペースが必要です精巧なシステム。ただし、通常、生き物がスポーンするのに十分なスペースがあると予想される場合は、これで十分です。
私自身、別の解決策を見つけました。特定の衝突領域を持つオブジェクトを操作していたため、場所の会議の原点xとyを確認するだけでは機能しませんでした。私はまだ完全にテストしていませんが、このソリューションとその動作は今のところうまく機能していると思いました。また、それほど効率的ではないと思います。これが私のコードです:
while (true) {
done = true;
with(obj_wall) {
if (point_distance(other.x, other.y, x, y) < 30) {
other.x = random(room_width);
other.y = random(room_height);
done = false;
}
}
if (done) {
break;
}
}
上記のコードは、現在ゲーム内にあるすべてのobj_wallをループします。新しくスポーンしたクリーチャーが壁から30ピクセルの領域にある場合、ランダムに新しい場所が選択されます。新しい場所が選択されるたびに、衝突が再度チェックされます(変数の実行)。それが役に立てば幸い!