【GameMaker Studio 2】直線と最初に衝突する物体を取得する

導入

collision_lineは(x1, y1)と(x2, y2)を結ぶ直線と衝突する物体のIDを返してくれますが、(x1, y1)に最も近い物体のIDを返すわけではありません。

「視点」の概念を導入するとき、(x1, y1)に最も近い物体のIDを返してくれたら便利です。悩んでいる人の為にも、その関数を作ることにしました。

※海外の人が既に同じ関数を作っていましたが、バージョンが異なっているし、コードが長めだったので、新規に作ることにしました。

コード

以下のコードを、「スクリプト」に突っ込んでおけば動きます。

(x1, y1)と(x2, y2)を結ぶ直線上にある全てのobjの内、(x1, y1)に最も近いobjのインスタンスIDを返します。

function collision_line_first(x1, y1, x2, y2, obj)
{
	var list_ = ds_list_create();
	
	collision_line_list(x1, y1, x2, y2, obj, false, true, list_, true);
	if (ds_list_size(list_) >= 1)
	{
		list_0 = list_[| 0];
		ds_list_destroy(list_)
		return list_0;
		
	}
	ds_list_destroy(list_);
	return noone;
}

※データリストがインスタンスであることに注意

使わなくなったds_listは自動的に捨てられるわけではないので、ds_list_createをしたあと、ds_list_destroyで必ずインスタンスを捨てる必要があります。

自分はその失敗をしてメモリを一瞬で喰われました…。

【GameMaker Studio 2】親オブジェクトの変数や関数を子オブジェクトで継承する方法

導入

オブジェクトの親オブジェクトを設定したとき、子オブジェクトの「Create」や「Step」は親オブジェクトと同じものに設定されます。

子オブジェクトの「Create」や「Step」を新たに作成すると、親オブジェクトの「Create」や「Step」は消えてしまい、変数や関数を継承できません。

じゃあどうすれば良いか?…その答えが見つかったので、それを共有したいと思います。

前提として

オブジェクトの「Parent」という欄でオブジェクトの親オブジェクトを設定することができます。

方法①(関数と変数を継承)

例えば「Create」に書かれている関数を継承したい場合、子オブジェクトに新しく「Create」を作り、その一行目に以下のコードを挿入する。

// 子オブジェクトの「Create」
event_perform_object(object_get_parent(object_index), ev_create, 0);

このコードは、親オブジェクトの「Create」を呼ぶコードです。このコードの下に処理を書いていけば、任意の変数や関数を変更することができます。

また、親オブジェクトの「Step」を呼びたいときは、ev_createをev_stepに変更すると良いです。

方法②(変数のみを継承)

親オブジェクトを開き、「VariableDefinition」を開きます。そして、「Name」 に変数の名前、「Type」に変数の型、「Default」に初期値を入れます。

次に、子オブジェクトの「VariableDefinition」を開き、変数の右にある「鉛筆マーク」をクリックすると、変数はオーバーライドされます。このとき、変数を初期値を独自に変更できるようになります。

また、オーバーライドを解除したいときは同じ場所を再度クリックすると良いです。