見出し画像

【GameMaker】スクリプトが正しく呼べていないとき

うまく処理をまとめてスクリプトにしたのに。。
思ったように動かない ( ;ᯅ; )

起きたこと

スクリプトにweaponクラスを実装した。
weaponクラスをもとに「shotgun」を作ったが、
「if (shotgun.isDefaultItemObj) {}」の分岐が必ずTrueになってしまう。
shotgun.itemObjには「obj_shotgun」がコンストラクタで入っているので、正しくはfalseになるはず。

/* Step Event */
var shotgun = weapon("gun", obj_shotgun);

// かならずTrueになってしまう?
if (shotgun.isDefaultItemObj) {
	// 処理
}

/* weapon.scr */
function weapon(
	_category="", _itemObj=obj_dummy
) constructor {
	category = _category;
	itemObj = _itemObj;
	
	isDefaultItemObj = function() {
		return itemObj == obj_dummy
	}
}

原因

()なしの「isDefaultItemObj」で関数を呼び出していた。shotgun.isDefaultItemObjが関数として存在しているかどうかが評価されるので、常にtrueで返ってきてしまっている。

対応

isDefaultItemObj()とする。
シンタックスエラーもコンパイルエラーも発生しないので、見落としやすい!

if (shotgun.isDefaultItemObj()) {
	// 処理
}

補遺

スクリプトの関数呼び出し自体に()をつけ忘れていても同じことが発生する模様。
※今回ならweapon関数

この記事が気に入ったらサポートをしてみませんか?