# Gameクラス

Gameクラスはjgame.jsのゲームそのものを司るクラスです。 このクラスの主な役割は、ゲームのサイズ管理、メインループの管理ですが、それ以外にも各種クラスとの橋渡しを行っています。 また、キーボードやマウスのイベントを一番最初に処理するのも本クラスです。
var game = new Game(480, 480); ゲームの大きさを指定してインスタンスを生成します。 第一引数はゲームの横幅、第二引数はゲームの縦幅を指定します。
コンストラクタ自体がゲーム起動のスイッチになっているため、インスタンスが生成された時点で本クラスは自動的にメインループを開始します。
Gameクラスのコンストラクタには、熟練者向きのオプションとして第四までの引数を指定する事が出来ます。 GameRendererクラスの第二、第三引数に相当するもので、詳しくはGameRendererクラスを参照してください。
_exit: bool; tick: number; renderTick: number; keymap: Object; renderer: Renderer; //現在利用されているRendererクラスを管理します scenes: Scene[]; //現在スタックされている全てのシーンを表します currentScene: Scene; //現在のシーンを表します。Gameクラスは、最初から一つのシーンを持っており、このシーンが終わるとゲーム終了と判断します resource: Resource; //リソースクラスです。通常はrメソッドを利用した方が良いでしょう。 width:number; //ゲームの横幅を管理します。単位はピクセルです。 height:number; //ゲームの縦幅を管理します。単位はピクセルです。 targetFps:number;//この値が設定されている場合、Gameクラスは画面更新をtargetFpsミリ秒に一回程度にします。30fpsであれば、1000/30を指定します fps: HTMLElement;//fpsを表示するDOM要素です。この値が無ければ、fpsの計算処理自体を省略します timers: GameTimer[]; onmousedown: any;//イベントではありません。内部的にDOMとの連携のために利用されます onmousemove: any;//イベントではありません。内部的にDOMとの連携のために利用されます onmouseup: any;//イベントではありません。内部的にDOMとの連携のために利用されます loaded: Trigger; preload完了を通知するイベントです。パラメータはありません。 --- update: Trigger; t:number;//前回からの経過時間を表します。 時間経過を表す最も基本的なイベントです。非常に高い頻度で処理されるイベントであるため、利用が終わったイベントについてはremoveを忘れないように注意してください。 このイベントでは前回からどの程度時間が経過したかを計算する必要があります。 例えば、1秒で10ピクセル移動しようとした場合、一度のupdateイベントで移動する値は (10 / 1000 * t)という計算になります。 この計算が大変な場合、擬似的なenterFrameイベントが提供されています。そちらの利用も検討してください。 --- enterFrame:Trigger; enterFrameはupdateに近い時間経過を表すイベントですが、通常は無効化されています。 利用の際は、必ず以下の手続きを踏んでください。

    game.enterFrame = new Trigger();

このイベントとupdateの違いは、updateは一度の時間経過で一度しか呼ばれないのに対して、enterFrameは複数回呼ばれます。 例えば、前回の時間系から50ミリ秒経過した場合、updateはt引数に50の値を渡して一度呼びますが、enterFrameは引数無しで合計3回呼ばれた上で、次の時間経過の際に2の値を残します。 経過時間を気にしなくていいため、Flashに慣れた開発者であれば、updateよりもこちらの方が使いやすいかもしれません。 --- render: Trigger; 描画開始時に呼び出されるイベントです。パラメータはありません。 デフォルトでは無効化されているため、利用の際は必ず以下の手続きを踏んで下さい。

    game.render = new Trigger();

--- inputDown: Trigger; e:InputEvent;//入力内容を表します。実体はInputKeyboardEventかInputPointEventです。 入力が行われた時に呼び出されるイベントです。 キーボードであればキーを押した時、マウスであればマウスによるクリックが開始された時、タッチであればタッチされた時です。 タッチのイベントを処理するためには、Layerで処理するのであればLayerのenablePointingEventを、Entityで処理するのであればLayerとEntity双方のenablePointingEventを呼び出さなければならない点に注意してください。詳しくはInputPointEventも参照してください。 --- inputUp: Trigger; e:InputEvent;//入力内容を表します。実体はInputKeyboardEventかInputPointEventです。 入力が離された時に呼び出されるイベントです。 inputDownの項目も参照してください。 --- inputMove: Trigger; e:InputEvent;//入力内容を表します。実体はInputKeyboardEventかInputPointEventです。 入力中に移動があった時に呼び出されるイベントです。 inputDownとinputUpの最中に呼び出されます。マウスとタッチのみのイベントであり、キーボードでは発生しません。 inputDownの項目も参照してください。 --- enterFrameTick: number; --- scale: number;//fitToWindow用 ---
refresh() { ゲーム内のリソースを強制的にリフレッシュします。 スタンバイから復帰した場合など、環境によってはcanvasオブジェクトが破壊されている場合などがあるため、その復旧を試みます。 内部的に、メインループで10秒以上処理遅延が起きた場合に自動的にこのメソッドが実行されます。 --- isTouchEnable() { 現在実行されている環境で、タッチイベントの処理が有効かどうかを調べます。 --- pointHandler() { --- keyboardHandler() { --- addTimer(wait:number, owner:any, handler:Function) { wait:number; //タイマーの間隔をミリ秒で指定します。100であれば10分の1秒になります。 owner:any; //タイマーイベントが起動される時のthisを指定します handler:Function; //タイマーイベントを処理する関数を指定します GameTimerクラスによる特定時間で動作するタイマーを追加します。ゲーム内のメインループで管理されるタイマーであり、setIntervalを使ったタイマーのようにゲームとずれる事がありません。 通常は、updateでは処理単位が細かすぎる場合などに利用します。例えば、Characterクラスのアニメーションなどです。 --- removeTimer(wait:number, owner:any, handler:Function) { GameTimerクラスによる特定時間で動作するタイマーを削除します。パラメータはaddTimerの時と同じものを利用してください。 --- removeTimerAll(owner:any) { owner:any;//削除対象のクラスを指定します GameTimerクラスによる特定時間で動作するタイマーの内、特定のオブジェクトに関連付けらているものを全て削除します。 例えば、AというクラスがaddTimerを3つ使っていた場合、その3つを削除します。 addTimerを呼び出したクラスではなく、addTimerの第二引数に指定されたクラスが削除対象である事に注意してください。 --- changeScene(scene:Scene) { scene:Scene;//切り替えるシーン シーンを切り替えます。この際、古いシーンの１枚上に新しいシーンが追加されるという形になります。 古いシーンに戻る場合、endSceneを呼び出します。 もしも古いシーンを終わらせてから新しいシーンに移動したい場合、先にendSceneを呼び出してからchangeSceneをしなければならない点に注意してください。 --- endScene() { 現在のシーンを終了し、一つ古いシーンに戻ります。 最後の一つが終了した場合、ゲーム自体の終了処理が行われ、メインループも止まってしまう事に注意してください。 --- r(name:string) { name:string;//取得するリソースの名前を指定します。 リソースを取得します。 --- preloadArray(ary: string[], loadingScene?:Scene) { ary:string[];//読み込む素材を配列で指定します。 loadingScene?:Scene;//読み込み中に利用するシーン。省略の場合はLoadingSceneが利用される 配列を基に素材を読み込みます。以下のように指定出来ます。

    game.preloadArray(["a.png", "b.png"]);

この際、game.rで取得される名前はファイル名と同じになります。 この関数はpreloadへ一本化する方針のため現在非推奨となっています。version 0.7を目処に廃止させる予定ですので、今後は利用しないようにしてください。 --- preload(ary: {[key:string]: string; }, loadingScene?:Scene) { ary: any;//読み込む素材を指定します loadingScene?:Scene;//読み込み中に利用するシーン。省略の場合はLoadingSceneが利用される いくつかの方法で指定出来ます。 一つ目は連想配列を基に素材を読み込みます。以下のように指定出来ます。この際、game.rで取得される名前はaまたはbになります。

    game.preload({a: "a.png", b: "b.png"})

二つ目は配列形式で素材を読み込みます。以下のように指定出来ます。この際、game.rで取得される名前はファイル名と同じになります。

    game.preload(["a.png", "b.png"])

三つ目は文字列で指定します。この際、game.rで取得される名前はファイル名と同じになります。

    game.preload("a.png", "b.png")

jgame.jsでは連想配列形式を推奨しています。
なお、loadingSceneを利用する場合、そのloadingSceneはロード完了と同時に自発的にendSceneを行う必要がある点に注意してください。 GameクラスはloadingSceneに依存する事なくResourceを自分で監視しますが、loadingSceneを自動的に終了させる作業は行いません。 --- preloadComplete(cnt:number) { --- main() { メインループです。 --- setBgColor(r:number, g:number, b:number, a:number) { r:number;//赤 g:number;//緑 b:number;//青 a:number;//透明度。0で完全な透明、255で完全な不透明 背景色を指定します。全ての値は0〜255で指定します。 --- fitToWindow(no_center?:bool) { no_center?:bool;//省略可。trueが指定された場合中央に寄せない ゲームのサイズに関わらず、ゲーム全体を現在のwindowサイズに合わせた上で、余白に対して中央寄せします。 表示上拡大されるだけで、ゲーム内の座標処理などに変化はありません。 --- getWindowSize() { 現在ゲームが利用出来る領域のサイズを取得します。 ver0.3現在、この関数はブラウザ上のドキュメントのサイズと等価です。 --- end() { 現在のシーンを残したまま強制的にゲームを終了します。 ---
ゲームクラスを継承して新たなクラスを作る事も出来ます。 具体例はFrameGameクラスの実装などを参照してください。