HeadquartersD.N.A.Softwares標準ゲームエンジンAIMSの配布とかサポートとか。»Twitterでこんな疑問を頂戴しました。AIMSでプレイヤーが4人いる場合、同じ処理をする関数をコピペするしかないんだろうか。それともアクターから操作することができるのか。(@nekokoko)マルチプレイヤー時のアクタークラスの使い回しですが、アクターごとに固有のものといえば値スロット(VAR[n])があります。適当な値スロットにプレイヤー番号をセットし、それを参照するようにします。適当な処理......endendあとは、アクター生成後にsetv関数を用いてそのアクターの値スロットにプレイヤー番号をセットしてあげるようにすればできあがりです。このやり方では、「OnStart関数内でプレイヤー番号による分岐ができない」という問題があります。現時点のAIMSではOnStart関数の起動タイミングがcreateActor関数の中である都合、値スロットをセットする前にOnStart関数が起動してしまうのです。そのため、OnStart関数内ではプレイヤー別の処理ができません。すんの、というと、やや古くさいやり方ではありますが「グローバル変数経由で引数渡し」という手段を使います。あとはさっきのOnStepと同様これでだいたいのパターンには対処できると思います。泥臭いのでcreateActorの引数で値スロットの初期値決められるようにした方がいいんだろうなーとは思ってるのですが、可変引数の処理がちょっとややこしく、後回しにしているのが現状です。先日頂いたお便りから。Actorを2000個ほど生成すると処理落ちしてしまいます。処理落ちを改善する方法はありませんか?というわけで、大量のアクターで処理落ちするという事態を少しでも緩和する手段をご紹介します。AIMSのレイヤーには「高速描画モード」というものがありまして、レイヤーにはいくつかの制限がかかる代わりに描画速度が数倍に向上します。(客観的評価はしていませんが、Actor2000個を表示して15fpsだったものが60fpsに向上する程度には高速化されます)高速描画モードを入れるキーになる関数は下の2つ。グラフィックハンドル);setLayerUseFastDrawが高速描画ON/OFFの設定。setLayerGraphicForFastDrawはそのレイヤーで使うテクスチャの指定です。高速描画中の制限事項は下記の通り。1レイヤーにつき、1枚のテクスチャしか使えない。(テクスチャの一部分を切り出すのはOK)。そのレイヤーで使う画像はすべて1枚のテクスチャにまとめてあること。ブレンディングはBLEND_NORMALのみになり、個々のアクターにMOVER_SETBLENDを指示しても無視される。実装例としてはこんな感じ。レイヤー10を高速描画レイヤーにします。このアクターは高速描画されるまあ軽く書くとこんな感じです。弾幕のように大量のアクターをばらまく必要があるときは是非お試し下さい。»アクターの当たり判定を行う場合、前準備として当たり判定を画像に設定する必要があります。当たり判定の高さ)この関数で、グラフィックの特定位置に当たり判定に使用する矩形を追加します。当たり判定矩形は最大16個まで設定できます。当たり判定は「矩形同士が重なっているか?」で判定しています。重なっているかどうかを取得するには以下の関数を使用します。isHitActor([アクターハンドル],アクターハンドル)getHitLayer([アクターハンドル],レイヤー番号)isHitActorは指定されたアクター同士が重なっているかどうかをboolean値として返します。getHitLayerは指定されたアクターに対して「指定レイヤー上で重なっているアクターのハンドル」をLuaのテーブルとして取得します。複数のアクターを相手に判定を取る場合、isHitActorで1対1の判定を複数取るよりは、getHitLayerでまとめて判定を取った方が高速になります。レイヤーを使ってアクターをうまく分けておくのがコツです。»AIMSの動作の基本となる関数です。[]内の引数は省略できます。命令引数3]]])clearMover(アクターハンドル)「createActor関数でアクターを作る」→「作ったアクターにaddMover関数で動きを与える」がAIMSにおけるキャラクタ制御の基本です。addMoverで動作を操作するためには、createActorを実行したときに返ってくるアクターハンドル(number)を保存しておく必要があります。開始時刻はその動作を開始する時刻(単位フレーム)です。この命令を呼んた直後を0として、指定したフレーム数だけ経過したら動作が始まります。継続時間は動作を続ける時間となります。addMoverで指定できる動作命令は「MOVER定義一覧」のページを参考にしてください。(現在公開されている1.01ではMOVER_MOVETO_L以降の定義は実装されていません)clearMover関数は登録されている動作命令(待機中のもの含む)を全て消去します。カラーなど)は元に戻りません。»AIMSではキーの入力に以下の関数を使用します。[]内の引数は省略できます。getJoyPressCount([ゲームパッドID,]キーID)isJoyPressed([ゲームパッドID,]キーID)キーIDはそれぞれ以下のようなものが定義されています。BUTTON_UP/BUTTON_DOWN/BUTTON_RIGHT/BUTTON_LEFTキーボード・USBゲームパッドの上下左右キー。BUTTON_TRIG1~BUTTON_TRIGXXゲームパッドのボタン。キーボードでは設定ファイルの記述に準拠します。getJoyPressCountはそのボタンが押されている時間(フレーム数)を、isJoyPressedは押されているかどうかのboolean値(trueかfalse)を、それぞれ返します。あるボタンが1秒間(60フレーム)押しっぱなしになっていたらgetJoyPressCountは60を返すという仕組みです。サンプルの中で表示位置を移動するのに使っているaddMover関数は別のページで説明します。»AIMSでは画像の表示には2段階の手続きが必要です。レイヤー番号)これらの関数を用いて画像を読み込み、表示させます。表示している画像は明示的に開放を行う必要があります。画像の消去:vanish(アクターハンドル)画像リソースの開放:deleteGraphic(グラフィックハンドル)開放しない場合VGAのメモリに残り続けるため、メモリ不足になる可能性があります。AIMSでは表示させた画像ひとつひとつを「アクター」と呼びます。正確には「画像を表示している」のではなく「アクターが画像を表示している」と言うのが正しい表現になります。»AIMSのパッケージをダウンロードして解凍すると、protoというフォルダがあります。この中身が最低限のパッケージファイルです。common.luaゲームの制作に必要と思われる関数一式を記述するファイル。DNA-Sで制作に使っている関数などが記述されています。AIMS.luaAIMSの起動に必要な設定が一式記述されたファイル。書き換えする必要はほとんどありません。boot.luaAIMSが起動して一番最初に読み込むスクリプトファイル。AIMSは起動するとまずboot.luaをオープンします。Luaの流儀に従い、functionの外で宣言された変数をグローバル変数として組み込みます。サンプルでははじめに”prequire(“common.lua”);”と記述されていますが、これでcommon.luaの中に記述された関数などが組み込まれます。次に素材の各種リソースハンドルを保存するための「G」「S」「A」というテーブルをグローバル変数として宣言しています。Softwaresとしては上記のテーブルの中に保持することを推奨しています。それらの動作が終了したら、まず「OnLoad」という関数を実行します。この「OnLoad」という関数を実行するとbootシーンという最初のシーンを起動します。(※シーンに付いては後述)スクリプト内部で「quit」という終了関数が呼ばれるか、Windowsの閉じるボタンが押されると現在実行中のすべてのシーンを強制終了し「OnVanish」という関数を実行しプログラムを終了します。|A.I.M.S.のはじめかた。»AIMSでの開発に必要な環境は以下の通りです。2007)またLuaスクリプトの作成・編集に高機能エディタの利用を推奨します。以下の機能を利用する場合はそれぞれ対応するソフトウェアのインストールが必要です。動画を再生する場合、DirectShowフィルタに対応したCodecおよび動画TrueFontを表示する場合、TrueTypeフォントある程度のスペックがあればノートパソコンでも開発は可能ですが、基本的には自己責任となります。»AIMSでは、以下の機能が利用可能です。取得および再利用また、以下の機能については試験中の機能のため、ここでは取り扱いません。|A.I.M.S.のはじめかた。»チュートリアルカテゴリでは、AIMSを用いたゲーム作りについて必要な情報を集めていきます。AIMSでゲームを開発する際に必要となる、基本的な作業は以下の通りです。・画面の遷移また、AIMSでゲームを作るときに必要となるLuaスクリプトの記述方法や注意点なども、このカテゴリに記載していく予定です。