インスタンス関数を他オブジェクトに変数として渡し、渡したオブジェクトから実行しようとしてますがうまくいきません。
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();
こうしない理由は、実行する関数を固定せず、「渡した関数を実行させたい」からです。
(どの関数を渡すかは条件により変わる)
↑ここでオブジェクトBの変数
abc
に関数を代入しているので、オブジェクトB内からはobjectB.abc
が空でないか確認し、空でなければおそらく実行出来ると思います。IDE v2.3.3.574 Runtime v2.3.3.437
ちょっと再現してみたんですがエラーにはならずに実行できました。
ちなみに渡された関数はobjectBのStepイベントを以下のようにしても実行できます。
※シンタックスハイライトが効かず、F1でも飛べないですが...
↓下記コードで動きました
objectBの変数に、関数を代入しているので単純に、
objectBのStepで
other.abc();
とすると実行できました。
自分でテストしてみましたが、メッセージダイアログが、stepごと実行されました。
「other.」は間違いでした。
生高橋さんのように、そのままabcで実行して、引数を渡すこともできました。
皆さんありがとうございます。
> そのままで動いた
空のプロジェクトで試したら実行できました!
> objectBでwith無しでabc();で動く
これもできました! with(objectA)要らないんですね!
あと変数abcに入れた関数はscript_execute(abc)じゃなくて直接abc();で動くんですね!
では、なぜ自分のプロジェクトでは動かないのか。
objectBを作る部分を関数にしているとエラーになることが分かりました。
質問を簡潔にしようと思って、関数内に書いている事実を省略していました。
実際は下記のようにして、player操作でhoge()を実行する形にしていました。
objectAのCreateイベント
こうするとhoge()を実行するとエラーになります。
エラー:script_execute argument 1 unable to convert to integer, result is nan
インスタンス関数のスコープについてちゃんと理解できてないのかもしれません。
試しに、こうやってみました。
objectAのCreateイベント
こうしたら動きました。
まだ勉強が必要なようです。