Twitterでこんな疑問を頂戴しました。
AIMSでプレイヤーが4人いる場合、同じ処理をする関数をコピペするしかないんだろうか。それともアクターから操作することができるのか。(@nekokoko)
マルチプレイヤー時のアクタークラスの使い回しですが、アクターごとに固有のものといえば値スロット(VAR[n])があります。適当な値スロットにプレイヤー番号をセットし、それを参照するようにします。
1 2 3 4 5 6 | -- VAR[0] にプレイヤー番号が定義されているとする function Actor_OnStep() if (getJoyPressCount(VAR[0],BUTTON_TRIG1) == 1)then -- 適当な処理…… end end |
あとは、アクター生成後にsetv関数を用いてそのアクターの値スロットにプレイヤー番号をセットしてあげるようにすればできあがりです。
ですがこのやり方では、「OnStart関数内でプレイヤー番号による分岐ができない」という問題があります。現時点のAIMSではOnStart関数の起動タイミングがcreateActor関数の中である都合、値スロットをセットする前にOnStart関数が起動してしまうのです。そのため、OnStart関数内ではプレイヤー別の処理ができません。
じゃあどうすんの、というと、やや古くさいやり方ではありますが「グローバル変数経由で引数渡し」という手段を使います。こんな感じ。
1 2 3 4 5 6 7 8 9 10 11 | -- アクター生成時…… _PLAYER_ID = 0 -- この変数はlocal宣言してはいけない local a = createActor(player_graphic,320,240,1,"player"); -- アクタークラス function player_OnStart() VAR[0] = _PLAYER_ID; -- VAR[0]に保存 -- その他適当な初期化とか…… end -- あとはさっきのOnStepと同様 |
これでだいたいのパターンには対処できると思います。
あんまり泥臭いのでcreateActorの引数で値スロットの初期値決められるようにした方がいいんだろうなーとは思ってるのですが、可変引数の処理がちょっとややこしく、後回しにしているのが現状です。
1月 28th, 2011 |