GameMaker 日本語掲示板

【プログラミング一般】監視するか報告するか? / 8

9 コメント
views
16 フォロー
8

>仮にBが終了したことをAに伝える形にする場合、どういう方法にすると独立性を保てるのでしょうか?

「Bが終了したら呼び出される関数」をBに登録できるようにして、Bは終了時に登録されている関数を呼び出す、という形で実現できます。Bは誰に何の関数を登録されたのか知りません。終了時にただ機械的に登録された関数を呼び出すだけです。この設計にすることでBはAの存在を知ることなく終了したことを知りたい人に伝えることが出来ます。

C/C++では関数ポインタやファンクタ、C#ではデリゲート等で実装できます。
(GMSは触ったことがないので実現方法が分かりません、、、ごめんなさい、、、)

私が最初のポストで挙げた「コールバック型」というのはまさに上記のような実装のことです。特定のタイミングで呼び出してもらいたい関数を登録する設計です。

通報 ...
  • 9
    asa 2021/03/10 (水) 00:40:35 修正 >> 8

    GMSは関数への参照idを変数に入れたり、それを他の関数に渡したり渡された関数を実行したりできるので、それが該当するようです(GMSでの呼び方はよく分かりません)。

    例えば、
    Aが「歩く」のあとでBに演出表示をさせて「止まって」待機し、Bが完了したタイミングで「ジャンプ」に移る場合は、Aの「ジャンプする」の部分を関数jumpとして切り出しておいて、AがBに指示を出す時点で関数jumpを渡す(=コールバック関数)。Bは自分の処理が終わったら渡されてるA関数jumpを実行。その結果、Aはジャンプすると。

    // AからBに指示
    with (B) { scr_effect_show(id, scr_jump); }
    

    イメージ的にはAはBに「ジャンプ」の動きを移譲し、ぼーっと待機。Bは自分の処理を終えて関数jumpを呼び出し。Aは遠隔で操られ動かされる感じでしょうか(全然違うかもしれませんが)。

    関数jumpがどうやってAを参照し動かすのかですが、たぶん上記のコードのように、Aがコールバック関数を渡す時に自分のidを一緒に渡しておけば下記のようにBはwith構文で実行できるのでこれで対処できそうです。

    // Bの終了時
    with (someone) { script_execute(scr_jump); }
    

    これでBはAが誰だろうと知ったこっちゃなく何をするのかも知ったこっちゃなく済みます(と思います…)

    教えていただいたキーワードでいろいろ調べてみようと思います。ありがとうございます。