質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

enchant.jsで、Sceneをまたいで座標を保持したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 468

score 12

Sceneをまたいで、プレイヤーの座標を統一したいのですが、出来ません。

大まかな流れ

このプログラムは、startScene→mainScene→endSceneと流れます。
・startSceneでは主に「十字キーを押すとスタート」と書かれた画像('start.png')を表示し、十字ボタンを押されたらmainSceneに移ります。
・mainSceneでは十字キーを用いてプレイヤーを移動させ、敵にぶつかったらendSceneに移ります。
・endSceneでは主にRetryボタンとTweetボタンを表示し、Retryボタンを押すとstartSceneに戻ります。

実際のプログラムは以下の通りです。

window.focus();
enchant();


window.onload = function(){

    core = new Core(320,320);
    core.fps = 30;

    core.preload('pic.png','start.png','clear.png','restartbutton.png','tweetbutton.png');

    var url = "http://jyarin.starfree.jp/hidshoot1.html";
    url = encodeURI(url); //きちんとURLがツイート画面に反映されるようにエンコードする

    core.onload = function(){

        //グローバル変数
        state = 0;//0=始まり、1=ゲーム、2=終わり
        PlX = rand(320);
        PlY = rand(100)+220;
        EnX = rand(320);
        EnY = rand(100);
        //グローバル変数終わり

        //startScene
        var startScene = new Scene();
        startScene.backgroundColor = "#559955"; 

        core.pushScene(startScene);

        var players0 = new Player(PlX,PlY);
        var enemys0 = new Enemy(EnX,EnY);

        startScene.addChild(players0);
        startScene.addChild(enemys0);    

        var startPic = new Sprite(236,48);
        startPic.image = core.assets['start.png'];
        startPic.x = 42;
        startPic.y = 136;
        startScene.addChild(startPic);

        startScene.addEventListener('enterframe', function(e) {
            if(state == 0){
                if(core.input.left||core.input.right||core.input.up||core.input.down){
                    state = 1;
                    core.popScene();
                    core.pushScene(mainScene);
                } 
            }
        });

        //mainScene
        var mainScene = new Scene();
        mainScene.backgroundColor = "#559955"; 

        var players1 = new Player(PlX,PlY);
        var enemys1 = new Enemy(EnX,EnY);

        mainScene.addChild(players1);
        mainScene.addChild(enemys1);    

        mainScene.addEventListener('enterframe', function(e) {
            PlX = players1.x;
            PlY = players1.y;
            EnX = enemys1.x;
            EnY = enemys1.y;
            if(players1.within(enemys1,32)){
                state = 2;
                core.popScene();
                core.pushScene(endScene);
            }
        });

        //endScene
        var endScene = new Scene();
        endScene.backgroundColor = "#559955"; 

        var players2 = new Player(PlX,PlY);
        var enemys2 = new Enemy(EnX,EnY);

        endScene.addChild(players2);
        endScene.addChild(enemys2);

        var endPic = new Sprite(256,48);
        endPic.image = core.assets['clear.png'];
        endPic.x = 32;
        endPic.y = 136;
        endScene.addChild(endPic);

        var restartButton = new Sprite(100,50);
        restartButton.image = core.assets['restartbutton.png'];
        restartButton.x = 35;
        restartButton.y = 230;
        endScene.addChild(restartButton);
        restartButton.ontouchend = function () {
            state = 0;
            PlX = rand(320);
            PlY = rand(100) + 220;
            EnX = rand(320);
            EnY = rand(100);    
            core.popScene();
            core.pushScene(startScene);
        };

        var tweetButton = new Sprite(100,50);
        tweetButton.image = core.assets['tweetbutton.png'];
        tweetButton.x = 185;
        tweetButton.y = 230;
        endScene.addChild(tweetButton);
        tweetButton.ontouchend = function () {
            window.open("http://twitter.com/intent/tweet?text=シューティングをプレイ&url=" + url);
        };
    }

    core.start();
}

var Player = enchant.Class.create(enchant.Sprite,{

    initialize: function(x,y){
        enchant.Sprite.call(this,32,32);
        this.image = core.assets['pic.png'];
        this.x = x;
        this.y = y;
        this.frame = 1;
        this.addEventListener('enterframe', function(e) {
            if(state == 1){
                if(core.input.left) this.x -= 4; 
                if(core.input.right) this.x += 4; 
                if(core.input.up) this.y -= 4; 
                if(core.input.down) this.y += 4; 
            }
        });
    },
});

var Enemy = enchant.Class.create(enchant.Sprite,{

    initialize: function(x,y){
        enchant.Sprite.call(this,32,32);
        this.image = core.assets['pic.png'];
        this.x = x;
        this.y = y;
        this.frame = 0;
    },
});

問題

プログラムを起動した後、十字ボタンでプレイヤーを敵に接触させると、Retryなどのボタンが表示されると供に「プレイヤーが初めにいた位置に戻ってしまう」
またその後Retryボタンを押すと、画像('start.png')が表示されると供に「敵、プレイヤーが初めにいた位置に戻り」、その後十字ボタンを押すと「プレイヤーが敵と接触寸前の位置までワープし、場合によってはまたすぐにRetryボタンが出てくる」

理想

プログラムを起動した後、十字ボタンでプレイヤーを敵に接触させると、Retryなどのボタンが表示されると供に「プレイヤーが敵と接触した状態で制止する」
またその後Retryボタンを押すと、画像('start.png')が表示されると供に「敵、プレイヤーが新しい初期位置に移動し」、その後十字ボタンを押すと「その初期位置から移動し始める」

どうすれば理想を叶えられるか、教えてください。

自分の考え

恐らくplayers0,players1,players2などは、PlX、PlYの値をプログラム起動時にのみ代入し、その後更新されないのではないでしょうか?
デバッグ時にPlX,PlYの値は正しく変化していたため、そう思いました。
なのでこれらを更新させる方法を知りたいです。

もしこの考え方自体が間違っているのなら、その旨もお教え頂けると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

関数を使えば、情報を引き継げるみたいです。
例えば、startSceneでは、

core.startFx = function(){                                 //☆
  var startScene = new Scene();
        startScene.backgroundColor = "#559955"; 

        core.pushScene(startScene);


//  省略  //

        startScene.addEventListener('enterframe', function(e) {
            if(state == 0){
                if(core.input.left||core.input.right||core.input.up||core.input.down){
                    state = 1;
                    core.replaceScene(core.mainFx(PlX,PlY,EnX,EnY));    //☆
                } 
            }
        });
}                                                //☆


と書き換えます(//☆で修正箇所を表しました)。

また、core.onload() = function{//省略}の後に、core.replaceScene(core.startFx());と書く必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る