GameMaker 日本語掲示板

【解決】インスタンス関数を他オブジェクトに変数として渡し、渡したオブジェクトから実行する方法

7 コメント
views
16 フォロー

インスタンス関数を他オブジェクトに変数として渡し、渡したオブジェクトから実行しようとしてますがうまくいきません。

objectA はinstance関数 helloを持ちます。
objectA が objectB を作成し、hello を objectB の変数abcに入れます
objectBからこのhelloを実行したいのですがうまくいきません。

どうすればいいのでしょうか?または、根本的に考え方が間違ってるのでしょうか?



objectAのCreateイベント
instance関数を宣言し、objectBを作ります。objectBの変数abcにhelloを入れます。

function hello() {
   show_message("hello");
}

var _o = instance_create_depth(0, 0, 0, objectB);
_o.abc= hello;



objectBのStepイベント
こうするとエラーになります。

with (objectA) script_execute(other.abc);

エラー:script_execute argument 1 unable to convert to integer, result is nan

因みに、objectBで

with (objectA) hello();

こうしない理由は、実行する関数を固定せず、「渡した関数を実行させたい」からです。
(どの関数を渡すかは条件により変わる)

asa
作成: 2021/09/08 (水) 00:22:19
最終更新: 2021/09/08 (水) 07:07:50
通報 ...
1
hayate212 2021/09/08 (水) 00:45:42
var _o = instance_create_depth(0, 0, 0, objectB);
_o.abc= hello;

↑ここでオブジェクトBの変数 abc に関数を代入しているので、オブジェクトB内からは objectB.abc が空でないか確認し、空でなければおそらく実行出来ると思います。

2
生高橋 2021/09/08 (水) 00:52:06

IDE v2.3.3.574 Runtime v2.3.3.437
ちょっと再現してみたんですがエラーにはならずに実行できました。

ちなみに渡された関数はobjectBのStepイベントを以下のようにしても実行できます。
※シンタックスハイライトが効かず、F1でも飛べないですが...

abc();
3
hayate212 2021/09/08 (水) 00:54:20

↓下記コードで動きました

画像

4
hayate212 2021/09/08 (水) 00:55:00 >> 3

画像

5

objectBの変数に、関数を代入しているので単純に、

objectBのStepで

other.abc();

とすると実行できました。
自分でテストしてみましたが、メッセージダイアログが、stepごと実行されました。

6

「other.」は間違いでした。
生高橋さんのように、そのままabcで実行して、引数を渡すこともできました。

7
asa 2021/09/08 (水) 02:31:28 修正

皆さんありがとうございます。

> そのままで動いた
空のプロジェクトで試したら実行できました!


> objectBでwith無しでabc();で動く
これもできました! with(objectA)要らないんですね!
あと変数abcに入れた関数はscript_execute(abc)じゃなくて直接abc();で動くんですね!


では、なぜ自分のプロジェクトでは動かないのか。
objectBを作る部分を関数にしているとエラーになることが分かりました。
質問を簡潔にしようと思って、関数内に書いている事実を省略していました。
実際は下記のようにして、player操作でhoge()を実行する形にしていました。
objectAのCreateイベント

function hello() {
   show_message("hello");
}

function hoge() {
   var _o = instance_create_depth(0, 0, 0, objectB);
   _o.abc= hello;
}

こうするとhoge()を実行するとエラーになります。
エラー:script_execute argument 1 unable to convert to integer, result is nan

インスタンス関数のスコープについてちゃんと理解できてないのかもしれません。
試しに、こうやってみました。
objectAのCreateイベント

function hello() {
   show_message("hello");
}
	
scr1 = hello; // ここで変数に入れる

function hoge() {
   var _o = instance_create_depth(0, 0, 0, objectB);
   _o.abc= scr1;
}

こうしたら動きました。
まだ勉強が必要なようです。