2310


tm.scene.ManagerSceneによるシーンの遷移先とパラメータの受け渡しについて教えてください。

先にサンプルを貼ります。 [runstant: ManagerSceneのサンプル](http://goo.gl/GwvZ77)

シーンの切り替え順番をManagerSceneの初期化時に指定した順ではなく特定のシーンへ遷移させたいです。

またその際に遷移元からパラメータを渡し、遷移先のシーンで受け取ることは可能ですか？

サンプルのコメントにも軽く書いていますが例えばthis.app.popScene()の引数で渡すようなイメージです。


CC BY-SA 3.0
2014-12-20T08:48:18.590
2230
2014-12-21T05:07:27.660
2014-12-20T18:55:06.520
5029
5029
question
javascript tmlib.js
tmlib.jsのManagerSceneによるシーンの遷移先の指定とパラメータの受け渡しについて


_22:08 編集_

pushSceneを使用する例として、提示のサンプルを修正させてもらいました([こちら](http://goo.gl/zZQZ9B))

最初に現れるresult画面ではbackではなくて画面クリックで先に進んでください。 （変わったことがわかりやすい様にResultSceneにしてあります）  
appオブジェクトで管理していますので、再び表示したい場合は runし直してください。

パラメータの方は、シーンを生成するときに直接渡して、initの方で使ってあげればいいのではないでしょうか。

例えば TestSceneはnameをうけとっていますよね？ これは

[code]

    TestScene({name: "Geme3"});
    
[/code]

の様にすれば渡せると思います。

テンプレート(?)の、ResultScene継承したシーンであれば

[code]

    tm.define("InjectScene", {
        superClass: "tm.scene.ResultScene",
    
        init: function(param) {
            this.superInit();
    
            this.scoreLabel.text = param.score;
            this.bestLabel.text = param.best;
        },
        onpointingstart: function(){
            this.app.popScene();
        }
    });
    
[/code]

であれば、

[code]

    InjectScene({ score: 100, best: 1000});
    
[/code]

として渡すことができます。

なお、ResultSceneにはtimeLabelが見当たらなかった(WebStormでもscore, best,
nextはあったのですが)ため、bestに変更しています。

パラメータは名前は揃っている必要はないですがわかりやすさのために併せて修正しています。

途中でシーンを登場させるには、pushSceneを行います。 これにより、現在のシーンの流れにシーンをpushしてあげることができます。

pushしたシーンでも必要が無くなったら自分自身をpopSceneでpopしてください。
今回例としたInjectSceneでは、クリックさせるとpopするようにしています。

<http://phi-jp.github.io/tmlib.js/docs/index.html#!/api/tm.app.BaseApp-method-
pushScene>

[code]

    this.app.pushScene(InjectScene({ score: 100, best: 1000}));
    
[/code]

pushした画面にラベルが見えてしまっていますが、このあたりは別途調整が必要ですね。

* * *

追記

> で、例えばステージ1のシーン、ステージ2のシーンからも"result"という名前で呼び出せる方法があれば嬉しいな、と。
> その際にステージ1、ステージ2で使用したスコアなどのパラメータも上手く渡せる方法もあればついでに知りたい、という経緯でした。

appや現在のシーンからManagerSceneにアクセスする方法があるのかもしれませんが、 例えば以下の様に

[code]

    app.manager = MainScene();
    app.replaceScene(app.manager );
    
[/code]

appからMainSceneにアクセス可能にしておいて、

[code]

    // ②: 決まった順じゃなく動的にresultへ飛ばしたい
    this.app.manager.gotoScene("result");
    
    // 例えばこんなイメージでresultシーンへ飛び、resultシーンでsceneParamを受け取る
    // this.app.popScene("result", sceneParam);
    
[/code]

というようにgotoSceneを使えば移動は可能です。

<http://phi-jp.github.io/tmlib.js/docs/index.html#!/api/tm.app.BaseApp>

パラメータはmanagerからとるようにすれば可能だとは思いますが、

オブジェクトにセットする形はシーンオブジェクトを取得する方法が思いつきませんでした。

[サンプル](http://goo.gl/FxskTI)


CC BY-SA 3.0
2014-12-20T10:38:20.490
2241
2014-12-20T19:56:44.627
2014-12-20T19:56:44.627
728
728
2230
answer


サンプルを作りました! -> runstant: <http://goo.gl/H7TcpW>  
極力個々のシーンが独立するような作りになっています.

シーンの構成は,

  * ManagerScene 
    * TitleScene
    * Stage1Scene
    * Stage2Scene
    * ResultScene

となっており.

  * TitleScene -> **Stage1Scene** -> ResultScene
  * TitleScene -> **Stage2Scene** -> ResultScene

の２パターンの遷移をするようになっております.

方法についてですが, nextLabel と nextArguments を使います.

## nextLabel

シーンに nextLabel を設定することで ManagerScene で設定した nextLabel を上書きすることができます.

サンプルでは50行目あたりで使っています.

[code]

        this.button1.onpointingstart = function() {
            // nextLabel で飛び先変更できますよ♪
            this.nextLabel = "stage1";
            this.app.popScene();
        }.bind(this);
    
        this.button2.onpointingstart = function() {
            this.nextLabel = "stage2";
            this.app.popScene();
        }.bind(this);
    
[/code]

stage1 ボタンを選んだ場合は stage1 へ, stage2 ボタンを選んだ場合は stage2 へ 遷移しているのがわかるかと思います.

## nextArguments

これは次のシーンに渡す arguments を上書きすることができます.

サンプルの85行目あたりです.

[code]

        // ①: このパラメータを遷移先のシーンに受け渡したい
        // A. nextArguments ってやつで渡せますよ♪
        this.nextArguments = {
            score: this.score,
        };
    
        this.app.popScene();
    
[/code]

ちゃんとリザルトシーンにスコアが渡っているのがわかるかと思います.


CC BY-SA 3.0
2014-12-21T05:07:27.660
2310
2014-12-21T05:07:27.660
2162
2230
answer