# Sceneクラス

Sceneクラスはjgame.jsでのシーンを管理するクラスです。 ゲームのシーンとは、例えばシューティングゲームを例にとると、ゲームの流れはこのようになります。 これら一つ一つが、シーンです。

    オープニング→タイトル画面→機種選択→シューティング→ゲームオーバー→スコア→タイトル画面

シーンはゲームとしての機能を持っておらず、管理単位として機能するため、本Sceneクラスも管理のための便利メソッドで構成されています。 本格的なゲームを作る際にScene管理は必須となってくるため、一通り目を通しておくのがいいでしょう。
Sceneの利用方法については、サンプルが参考になるでしょう。 http://jgame-js.sourceforge.jp/scene.html このサンプルでは最初のタイトルシーン、次のキャラクターが動くシーン、スプライトが表示されるシーン、マップが表示されるシーンの合計４つのシーンを使っています。 マップの表示が終わった後はタイトルシーンに戻り、タイトルシーンの演出を少し変えて、簡単なムービー仕立てにしています。
jgame.jsでは、サンプルのようにSceneクラスのインスタンスとして利用する以外に、もう一つSceneクラスを継承して新しいSceneクラスを作るという方法も推奨しています。 TypeScriptで開発する場合、継承したSceneの宣言は以下のようになります。

    class TitleScene extends Scene {
    	constructor(game:Game) {
    		super(game);
    	}
    }

JavaScriptでは色々な方法がありますが、jgame.jsと同じ方法であれば下記の形になります。

    var TitleScene = (function (_super) {
    	__extends(TitleScene, _super);
    	function TitleScene(game) {
    		_super.call(this, game);
    	}
    })(Scene);

複雑なゲームを作る場合、プログラムの量が多くなってくるため、Scene継承を上手に使ってゲームと同じくプログラムもまとめると作りやすくなるでしょう。
var scene = new Scene(game); 関連付けるGameクラスのインスタンスを指定して、Sceneクラスのインスタンスを生成します。 生成しただけではSceneは有効になりません。GameクラスのchangeSceneメソッドを利用して、生成後必ずそのシーンを利用する手続きを踏む必要があります。
layers: {[key:string]: Layer; };//このシーンにあるLayer。デフォルトでrootという名前のレイヤーが作られています。 layerCount:number;//このシーンのレイヤー数 game:Game;//このシーンに関連付けられているGameクラス mode:string[];// showed:Trigger; シーンが表示された時に発生するイベントです。パラメータはありません。 初めて表示された時以外に、他のシーンが終わりシーンが再表示された時にも発生します。 --- hid:Trigger; シーンが隠された時に発生するイベントです。パラメータはありません。 他のシーンが始まりシーンが隠された時にのみ発生し、シーンが終了する時には発生しません。 --- ended:Trigger; シーン終了時に発生するイベントです。パラメータはありません。 --- started:Trigger; シーン開始時に発生するイベントです。パラメータはありません。 ---
currentMode():string { 現在のモードを返します。 --- getLayerArray():Layer[] { Layerを配列形式で返します。 --- enablePointingEvent() { InputPointEventを有効にします。 このメソッドで有効に出来るのはrootレイヤーに対してのみです。 他のレイヤーで有効にしたい場合、直接LayerクラスのenablePointEventを呼び出してください。 --- disablePointingEvent() { InputPointEventを無効にします。 このメソッドで無効に出来るのはrootレイヤーに対してのみです。 他のレイヤーで無効にしたい場合、直接LayerクラスのdisablePointEventを呼び出してください。 --- changeMode(mode:string) { mode:string;//切り替えた後のモード名 現モードを切り替えます。この際、現在のモードは下にスタックされ、新しいモードが上に詰まれます。 --- endCurrentMode(newMode?:string) { newMode?:string;//新しいモード 現在のモードを終了します。また、newModeを指定すると、即座に別のモードに切り替えます。 newModeの指定が無い場合、直近のモードになります。 --- createLayer(name:string):Layer { name:string;//作成するレイヤー名 新しくレイヤーを作成します。レイヤーの表示順は、後のレイヤーが常に上になります。作成順に注意してください。 --- deleteLayer(name:string) { name:string;//削除するレイヤー名 レイヤーを削除します。rootレイヤーは削除出来ません。 --- destroy() { このクラスが管理しているリソースを解放します。 --- end() { このシーンを終了します。GameクラスのendSceneメソッドと等価です。 --- refresh() { --- scrollTo(x:number, y:number, layerName?:string) { x:number;//スクロール後のx座標 y:number;//スクロール後のy座標 layerName?:string;//スクロールさせるレイヤー名。省略時はrootレイヤー 所定の位置にスクロールします。実体は、rootレイヤーをスクロールさせています。その他のレイヤーをスクロールさせる場合、直接LayerのmoveToを利用してください。 このスクロール処理は一瞬で完了するため、アニメーションが必要な場合、Layerクラスのtl()メソッドを利用した方がいいかもしれません。

    scene.layers.root.tl().moveTo(-100, 0);

--- scrollBy(x:number, y:number, layerName?:string) { x:number;//スクロールさせるxの相対座標 y:number;//スクロールさせるyの相対座標 layerName?:string;//スクロールさせるレイヤー名。省略時はrootレイヤー 現在位置から見て相対座標でスクロールします。実体は、rootレイヤーをスクロールさせています。その他のレイヤーをスクロールさせる場合、直接LayerのmoveByを利用してください。 このスクロール処理は一瞬で完了するため、アニメーションが必要な場合、Layerクラスのtl()メソッドを利用した方がいいかもしれません。

    scene.layers.root.tl().moveBy(-100, 0);

--- append(entity:E, layerName?:string) { entity:E;//追加するEntity layerName?:string;//追加するレイヤー名。省略時はrootレイヤー Entityをシーンに追加します。 --- removeEntity(entity:E) { entity:E;//削除対象のEntity Entityをシーンから削除します。全てのレイヤーからEntityの削除を試みるため、レイヤー名の指定は不要です。 ---

### モード管理について

シーンの機能の一つにモード管理がありますが、このモード管理はシーン内でさらに状態がある場合に利用されます。 例えばメニューシーンを作っていたとして、そのメニューシーンには「武器」「防具」「アイテム」といった項目があるとします。 武器を選択している状態は武器というモード、防具を選択している場合は防具というモード、アイテムを選択している場合はアイテムというモードというように、一つのシーンであっても多少の状態管理が必要になる場合があります。
下記にモード管理の簡単なサンプルがあります。 http://jgame-js.sourceforge.jp/mode.html モード管理のいいところは、慣れれば複雑な状態を管理しやすいところです。
なお、これ以外に、モードの名前が「menu」であればScene.menuHide、Scene.menuEnd、Scene.menuStart、Scene.menuShowというメソッドが、それぞれhid、showed、started、endedのSceneイベントと同じように、モード開始時や終了時に呼び出されます。 これらは、Sceneを継承して作成する際に役立てる事が出来ます。