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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

enchant.js

enchant.jsとは、アプリやゲームを簡単に開発できるオープンソースのHTML5+JavaScriptベースのフレームワークです。プログラミング学習にも用いられ、多くの素材やプラグインが用意されています。

Q&A

解決済

1回答

1113閲覧

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

jyarin

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

enchant.js

enchant.jsとは、アプリやゲームを簡単に開発できるオープンソースのHTML5+JavaScriptベースのフレームワークです。プログラミング学習にも用いられ、多くの素材やプラグインが用意されています。

0グッド

0クリップ

投稿2020/04/15 09:46

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

大まかな流れ

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

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

JavaScript

1window.focus(); 2enchant(); 3 4 5window.onload = function(){ 6 7 core = new Core(320,320); 8 core.fps = 30; 9 10 core.preload('pic.png','start.png','clear.png','restartbutton.png','tweetbutton.png'); 11 12 var url = "http://jyarin.starfree.jp/hidshoot1.html"; 13 url = encodeURI(url); //きちんとURLがツイート画面に反映されるようにエンコードする 14 15 core.onload = function(){ 16 17 //グローバル変数 18 state = 0;//0=始まり、1=ゲーム、2=終わり 19 PlX = rand(320); 20 PlY = rand(100)+220; 21 EnX = rand(320); 22 EnY = rand(100); 23 //グローバル変数終わり 24 25 //startScene 26 var startScene = new Scene(); 27 startScene.backgroundColor = "#559955"; 28 29 core.pushScene(startScene); 30 31 var players0 = new Player(PlX,PlY); 32 var enemys0 = new Enemy(EnX,EnY); 33 34 startScene.addChild(players0); 35 startScene.addChild(enemys0); 36 37 var startPic = new Sprite(236,48); 38 startPic.image = core.assets['start.png']; 39 startPic.x = 42; 40 startPic.y = 136; 41 startScene.addChild(startPic); 42 43 startScene.addEventListener('enterframe', function(e) { 44 if(state == 0){ 45 if(core.input.left||core.input.right||core.input.up||core.input.down){ 46 state = 1; 47 core.popScene(); 48 core.pushScene(mainScene); 49 } 50 } 51 }); 52 53 //mainScene 54 var mainScene = new Scene(); 55 mainScene.backgroundColor = "#559955"; 56 57 var players1 = new Player(PlX,PlY); 58 var enemys1 = new Enemy(EnX,EnY); 59 60 mainScene.addChild(players1); 61 mainScene.addChild(enemys1); 62 63 mainScene.addEventListener('enterframe', function(e) { 64 PlX = players1.x; 65 PlY = players1.y; 66 EnX = enemys1.x; 67 EnY = enemys1.y; 68 if(players1.within(enemys1,32)){ 69 state = 2; 70 core.popScene(); 71 core.pushScene(endScene); 72 } 73 }); 74 75 //endScene 76 var endScene = new Scene(); 77 endScene.backgroundColor = "#559955"; 78 79 var players2 = new Player(PlX,PlY); 80 var enemys2 = new Enemy(EnX,EnY); 81 82 endScene.addChild(players2); 83 endScene.addChild(enemys2); 84 85 var endPic = new Sprite(256,48); 86 endPic.image = core.assets['clear.png']; 87 endPic.x = 32; 88 endPic.y = 136; 89 endScene.addChild(endPic); 90 91 var restartButton = new Sprite(100,50); 92 restartButton.image = core.assets['restartbutton.png']; 93 restartButton.x = 35; 94 restartButton.y = 230; 95 endScene.addChild(restartButton); 96 restartButton.ontouchend = function () { 97 state = 0; 98 PlX = rand(320); 99 PlY = rand(100) + 220; 100 EnX = rand(320); 101 EnY = rand(100); 102 core.popScene(); 103 core.pushScene(startScene); 104 }; 105 106 var tweetButton = new Sprite(100,50); 107 tweetButton.image = core.assets['tweetbutton.png']; 108 tweetButton.x = 185; 109 tweetButton.y = 230; 110 endScene.addChild(tweetButton); 111 tweetButton.ontouchend = function () { 112 window.open("http://twitter.com/intent/tweet?text=シューティングをプレイ&url=" + url); 113 }; 114 } 115 116 core.start(); 117} 118 119var Player = enchant.Class.create(enchant.Sprite,{ 120 121 initialize: function(x,y){ 122 enchant.Sprite.call(this,32,32); 123 this.image = core.assets['pic.png']; 124 this.x = x; 125 this.y = y; 126 this.frame = 1; 127 this.addEventListener('enterframe', function(e) { 128 if(state == 1){ 129 if(core.input.left) this.x -= 4; 130 if(core.input.right) this.x += 4; 131 if(core.input.up) this.y -= 4; 132 if(core.input.down) this.y += 4; 133 } 134 }); 135 }, 136}); 137 138var Enemy = enchant.Class.create(enchant.Sprite,{ 139 140 initialize: function(x,y){ 141 enchant.Sprite.call(this,32,32); 142 this.image = core.assets['pic.png']; 143 this.x = x; 144 this.y = y; 145 this.frame = 0; 146 }, 147});

問題

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

理想

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

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

自分の考え

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

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

javaScript

1core.startFx = function(){                 //☆ 2 var startScene = new Scene(); 3 startScene.backgroundColor = "#559955"; 4 5 core.pushScene(startScene); 6 7 8//  省略  // 9 10 startScene.addEventListener('enterframe', function(e) { 11 if(state == 0){ 12 if(core.input.left||core.input.right||core.input.up||core.input.down){ 13 state = 1; 14 core.replaceScene(core.mainFx(PlX,PlY,EnX,EnY)); //☆ 15 } 16 } 17 }); 18}                              //☆ 19

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

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

投稿2020/04/19 08:46

jyarin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問