mruby for Pad Game System system.rb ドキュメント

Spriteモジュール

テクスチャを管理するモジュール。テクスチャ画像を読み込み、それをセルに切り分けて管理します。
Sprite.dump
現在のスプライトの状態をコンソールに出力します。
Sprite.clear
ロードされているスプライトすべてを廃棄します。
Sprite.update
ムービーテクスチャのアップデートをします。Game.updateで呼んでください。
Sprite.load (key,String filename[,Boolean loopflag=true,Boolean hasalpha=false])
スプライトをロードします。rubyのハッシュのキーには数値も文字列もシンボルも使えるので、状況で使い分けてください。
これは画像を読み込む関数です。セルの切り分け等は他の関数で行います。デフォルトでは、全体をセル0とみなします。
filenameにはNMVファイルも指定できます。この場合ムービーテクスチャになります。ムービーテクスチャの場合はループするかどうか、α値を持つムービーかどうかを指定できます。
filenameに"*幅,高さ,色"(例:"*800,600,0xFFFFFFFF")とすれば塗りつぶし画像を指定できます。
Sprite.text(key,text,x,y,font)
スプライトの座標x,yにフォントfont(Fontオブジェクトです)で文字列textを描画します。
Sprite.setcelldata(key,celldata)
読んだスプライトをセルに切り分ける情報を設定する関数です。
json等で読み込んだものか、rubyスクリプトで記述して作った配列データを割り当ててください。
セルデータは1次元配列で、セル0から順にデータを格納してください。一セル分のデータは、これも配列で、[sx,sy,sw,sh]です。
sx,syはテクスチャ上の左上座標、sw,shはセルの幅と高さです。ピクセル単位です。
Sprite.slice(key,Fixnum w,Fixnum h[,Fixnum space_x,Fixnum space_y])
読んだスプライトをセルに切り分ける関数です。幅と高さで格子状に切り分けます。
space_xとspace_yに値を指定すると、チップの周囲(上下左右端も含む)に、それだけのスペースが開いているものとみなします。
これは、外部ツールの一部にはテクスチャの拡大縮小補間対策にスペースを空けてあるものがあるからです。
space_xとspace_yを指定するときには、wとhはスペースの分を含まないチップそのものの大きさを指定してください。
Sprite.slicenum (key,xnum,ynum)
読んだスプライトをセルに切り分ける関数です。こちらは横方向と縦方向の分割数を指定します。
Sprite.gettexture(key) → Texture
テクスチャオブジェクトを返します。
Sprite.delete(key)
指定されたスプライトを削除します。
Sprite.copy(key_dest,key_src)
key_destで指定されたキーのスプライトを作成し、key_srcで指定されたキーのスプライトをコピーします。
テクスチャを加工したいけど元のものも残しておきたい、というようなときに使えます。
Sprite.draw(key,Fixnum cell)
キーとセルを指定し、描画します。Draw.fromとDraw.putを内部で呼び出します。
Sprite.get(key,Fixnum cell) → [Texture tex,Fixnum sx,Fixnum sy,Fixnum sw,Fixnum sh]
キーとセルを指定し、Textureインスタンス、転送元x,y,幅、高さの情報が入った配列を得ます。見つからなかった場合はnilが戻ります。
Sprite.isplaying(key)→Boolean
キーで指定されたスプライトがムービーテクスチャである場合、再生中ならtrue、停止していればfalseを返します。
ムービーテクスチャでない場合は常にfalseを返します。
Sprite.monotone(key,color)
スプライトを指定した色(0xAARRGGBB)でモノトーンにします。
Sprite.mask(key)
スプライトをアルファチャンネル化(アルファ値だけが残った白色画像)にします。

TiledMapクラス

Spriteモジュールにロードされたマップチップを利用してタイルマップを表示するクラスです。
マップはラップ表示されるので、ラップさせたくない場合は各端でスクロールを止めてキャラクターのほうを動かすなどの処理が必要です。
TiledMap.new(spkey)→TiledMap
タイルマップオブジェクトを作成します。Spriteモジュールのキーで、マップチップを指定します。
マップの1チップの大きさはセル0番の大きさで設定されます。
tmap.setanimation(mapanimation_data)
タイルマップのセルアニメーションを設定します。
mapanimation_dataはハッシュです。アニメーションさせたいセル番号をキーとして、値は[アニメセル枚数,一コマあたりのフレーム数]です。
表示セル番号はセル枚数までは1ずつ増えていき、それを超えるとデータ上のセル番号に戻ります。
つまり、{1=>[3,10]}の場合だと、セル番号1のチップは、10フレームごとに1 2 3 1 2 3 1 ... とアニメーションします。
あまり細かい制御は出来ませんが、複雑なアニメーションをさせたい場合はAnimatorを作ってそれを重ねて表示してください。
tmap.draw(x,y,resolution[,alpha])
マップ上の座標x,yを左上にして画面に描画します。単位はチップサイズ/resolutionです。alphaは指定しない場合255になります。
resolutionは指定した値の解像度を示します。チップサイズを割る数を指定します。つまり、4を指定すればxとyは4で1チップ分になります。
これは、半キャラ・1/4キャラ等の単位でスクロールさせたい時に使います。整数を指定してください。
tmap.setdata(w,h,data)
マップデータを設定します。w,hは幅と高さ、dataはチップ番号(=セル番号)の入った1次元配列でサイズがw*hである必要があります。チップ番号-1は表示しないことを示します(重ねあわせ用)
マップデータは配列を参照しているだけです、コピーはしていません。dataを呼び出し側でも取っておけば、それをいじればマップを動的に変えることが出来ます。
なお、アニメーションの同期のためのタイマはタイルマップオブジェクト内で共通です。
tmap.get(x,y)
指定したマップ座標のチップ番号を得ます。drawと違い、こちらはresolutionが設定できません。
なお、getで得られる値はデータ上のものです。アニメーション上のセル番号は表示するときだけに使われます。

Animatorクラス

セルアニメーションするオブジェクトを管理するクラスです。内部でそれぞれのフレームの時間も管理しています。
Animator.new(spkey,animation_list)
Animatorオブジェクトを作成します。spkeyはアニメーションが使用するスプライトのキーです。
animation_listはハッシュで、アニメーションの種類をキー(例えば:down :upのように)、animation_dataを値に持ちます。
キー0はデフォルトのアニメーションとして扱われます。作成したばかりでsetを指定していない場合、アニメーションanimation_list[0]を指定したことになります。ない場合、drawでエラーになります。デフォルトを作らない場合は、必ずdrawより前にsetでアニメーションキーをセットしてください。
animation_dataは配列で、[[cell,time],[cell,time],...]という形式になっています。それぞれのセル番号と時間(フレーム数単位)です。
timeに-1を指定すると、ループせずそこでアニメーションが止まります。timeに-1が指定されていなかった場合、配列の最後の要素まで終わると先頭に戻ります。
アニメーションがひとつしかない場合は、animation_listハッシュではなくanimation_data配列を渡すことが出来ます。自動でそれがキー0のアニメーションとして設定されます。
アニメーションがひとつで、1セルしかない場合(つまり静止している場合)は、セル番号のみを渡せます。自動でそれがキー0のアニメーション、1セルのみで停止、として設定されます。
anim.set(animkey)
アニメーションのキーを指定してアニメを開始します。
アニメーションのキーが現在と同じ場合は何もしません。リセットもしません。
anim.pause
アニメーションを一時停止します。
anim.resume
アニメーションの一時停止を解除します。一時停止していない場合何もしません。
anim.reset
現在のキーのアニメーションを最初から再生します。
anim.isplaying→Boolean
セルがひとつしかない場合(つまり止まってる場合)、もしくはアニメーションがtime=-1で止まっている場合はfalse、それ以外のアニメーションを再生中ならtrueを戻します。
anim.draw([alpha])
アニメーション状態に合わせて描画します。alphaは指定しないと255になります。

Windowクラス

テキスト等を表示するウィンドウを管理するクラスです。スプライトとして「ウィンドウ枠」を指定する必要があります。
ウィンドウ枠はセル0~8がそれぞれ同サイズの正方形だと想定し、左上から右下に対応し、それぞれをタイル上に並べてウィンドウを作ります。
(正方形スプライト画像をロードしてslicenumで3,3を掛ければ一番簡単にそのような設定になりますが、他の方法でそうしても構いません。)
Windowクラスのインスタンスは内部に描画したテキストを記憶するTextureを持っていますので、使い終わったらdeleteしたほうがリソースの節約になります。
Window.new(spkey,w,h)→UI
ウィンドウを作成します。spkeyはスプライトのキー、w,hは幅と高さです。単位はスプライトのセルの幅です(ピクセルではありません)。
たとえば10,5を指定すると、スプライト枠のセル4番(真ん中)の画像を10x5個並べて、その周りに適切な枠の画像を並べることになります。
Window.delete
ウィンドウを明示的に削除します。
wnd.draw(x,y,[alpha])
ウィンドウを指定位置に描画します。alphaの指定を省略すると255になります。
枠を表示する
wnd.text(text,x,y,font)
ウィンドウに文字列を書き込みます。x,yは座標です。(枠ではなく文字を表示する部分の左上からの相対座標、ピクセル単位)。
fontはフォント、textは表示する文字列です。戻り値は、書き込んだ文字数です。
wnd.textstart(text,x,y,font)
テキストを一文字ずつ表示するモードをスタートします。このメソッドを呼び出しただけでは一文字も書かれません。
呼び出してからnextを呼ぶと、そのたびに一文字ずつ書いていきます。
wnd.textnext→Boolean
textstartで設定した文字を一文字書き込み、それでテキスト書き込みが終了したらtrue、まだならばfalseを返します。
wnd.textstop(flushflag)
textstartで設定した文字列出力を終了します。
flushflagにtrueを設定すると全部テキストを書き込んでから終了します。falseの場合は書き込まずにその場で終了します。
wnd.textclear
テキストウィンドウをクリアします。

Selectクラス

ウィンドウからのパッド入力による選択肢の選択を処理するクラスです。
テキストをすべて表示し終わった後のWindowオブジェクトを指定し、このクラスのインスタンスを作成します。
このクラスのインスタンスを削除してもWindowが削除されるわけではありませんので、例えばマルチウィンドウの時に下に出したままに出来ます。
Select.new(window,[[curx,cury],[curx,cury],...],cursor[,row])→Select
Selectオブジェクトを作成します。windowは選択肢に割り当てたいWindowオブジェクトです。
[[curx,cury],...]は、一つ目の選択肢から順に、ウィンドウの左上からの座標を配列にした二重配列です。
cursorにはカーソル画像としてAnimatorオブジェクトを渡します。
rowに数値を指定すると複数列に対応します。一列の長さを指定してください(パッドの左右を押した時にそれだけ選択番号が進んだりもどったりします)
sel.draw(x,y[,alpha])
指定した位置に選択肢ウィンドウとカーソルを表示します。alphaは省略すると255になります。
sel.pad→Fixnum
パッド入力による選択/決定処理をします。
戻り値は、0以上の数は選択された選択肢番号、nilはまだ決定されていない状態、-1はキャンセルが押された状態です。

デフォルトのゲームループの実装

Game.initialize
Fiberを作成しトップレベルのmainメソッドを呼んでいます。
Game.update
ムービーテクスチャを更新し、シーンを描画して、mainメソッドに処理を戻します
Game.finalize
デフォルトの実装では何もしていません。

トップレベルメソッド

doevents
フレームを描画し、メッセージを処理し、VSYNC管理をします。
メインルーチンで一フレーム分の処理が全部終わった時にこれを呼んでください。