AIMS Headquarters
D.N.A.Softwares標準ゲームエンジンAIMSの配布とかサポートとか。
  • Home
  • AIMS とは
  • AIMS のドキュメント
  • AIMSをダウンロード
  • このサイトについて

複数のプレイヤーで同じアクタークラスを使い回す

チュートリアル Add comments

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 |

Leave a Reply

  • Twitter

    Tweets about "#GE_AIMS -RT"
  • 最近の投稿

    • AIMS v1.91b 公開
    • AIMS ver1.91公開
    • AIMS ver1.90a公開(追記)
    • AIMS本、PDF版を販売しています
  • 最近のコメント

    • カテゴリー

      • おしらせ
      • サンプル
      • チュートリアル
      • リリース
      • 未分類
    • リンク - AIMS開発

      • D.N.A.Softwares
    • リンク - ライブラリ

      • The Programming Language Lua
      • 工事中(仮)
    RSS XHTML CSS ログイン
    Wp Theme by n Graphic Design | i Software Reviews
    Powered by Wordpress