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

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

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

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

enchant.js

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

Q&A

解決済

1回答

1533閲覧

enchant.jsにおいて、intersect関数による接触判定がオブジェクトが生成した瞬間にしか行われない

jyarin

総合スコア12

JavaScript

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

enchant.js

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

0グッド

0クリップ

投稿2020/04/19 09:45

編集2020/04/19 13:51

シューティングゲームを作っています。
敵に弾を当てたら終了画面を映すプログラムが欲しいのですが、弾を発射した瞬間にだけしか、弾が当たり判定を持ちません。

具体的に言えば、「離れた所から弾を当てても終了画面が映らないが、接射すると終了画面が映る」状態です。

離れた場所から弾を当てても、終了画面を映す方法を教えてください。

コード

Sボタンを押せば弾丸(plbul)がまっすぐ上に発射され、敵(enemys1)に当たれば終了画面のシーン(core.endFx)に行くコードです。

javaScript

1 mainScene.addEventListener('enterframe', function(e) { 2 if(core.input.s){ 3 var plbul = new PlBul(players1.x,players1.y - 32); 4 mainScene.addChild(plbul); 5 } 6 if (enemys1.intersect(plbul)) { 7 core.replaceScene(core.endFx(PlX,PlY,EnX,EnY)); 8 } 9 }); 10 return mainScene; 11 } 12

参考までに、コード全文を載せておきます。

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 core.keybind(83, 's'); 12 13 var url = "http://jyarin.starfree.jp/hidshoot1.html"; 14 url = encodeURI(url); //きちんとURLがツイート画面に反映されるようにエンコードする 15 16 core.onload = function(){ 17 18 //グローバル変数 19 state = 0;//0=始まり、1=ゲーム、2=終わり 20 //グローバル変数終わり 21 22 //startScene 23 core.startFx = function(){ 24 25 PlX = rand(320); 26 PlY = rand(100)+220; 27 EnX = rand(320); 28 EnY = rand(100); 29 30 var startScene = new Scene(); 31 startScene.backgroundColor = "#559955"; 32 33 34 var players0 = new Player(PlX,PlY); 35 var enemys0 = new Enemy(EnX,EnY); 36 37 startScene.addChild(players0); 38 startScene.addChild(enemys0); 39 40 41 var startPic = new Sprite(236,48); 42 startPic.image = core.assets['start.png']; 43 startPic.x = 42; 44 startPic.y = 136; 45 startScene.addChild(startPic); 46 47 startScene.addEventListener('enterframe', function(e) { 48 if(state == 0){ 49 if(core.input.left||core.input.right||core.input.up||core.input.down||core.input.s){ 50 state = 1; 51 core.replaceScene(core.mainFx(PlX,PlY,EnX,EnY)); 52 } 53 } 54 }); 55 56 return startScene; 57 } 58 59 //mainScene 60 core.mainFx = function(PlX,PlY,EnX,EnY){ 61 62 var mainScene = new Scene(); 63 mainScene.backgroundColor = "#559955"; 64 65 //キャラの描画 66 var players1 = new Player(PlX,PlY); 67 var enemys1 = new Enemy(EnX,EnY); 68 69 mainScene.addChild(players1); 70 mainScene.addChild(enemys1); 71 72 var PlBulGap = 0; 73 74 mainScene.addEventListener('enterframe', function(e) { 75 76 if(core.input.s && core.frame - PlBulGap >= 10){ 77 PlBulGap = core.frame; 78 var plbul = new PlBul(players1.x,players1.y - 32); 79 mainScene.addChild(plbul); 80 } 81 82 if (enemys1.intersect(plbul)) { 83 state = 2; 84 PlX = players1.x; 85 PlY = players1.y; 86 EnX = enemys1.x; 87 EnY = enemys1.y; 88 core.replaceScene(core.endFx(PlX,PlY,EnX,EnY)); 89 } 90 91 }); 92 93 94 return mainScene; 95 } 96 97 //endScene 98 core.endFx = function(PlX,PlY,EnX,EnY){ 99 100 var endScene = new Scene(); 101 endScene.backgroundColor = "#559955"; 102 103 var players2 = new Player(PlX,PlY); 104 var enemys2 = new Enemy(EnX,EnY); 105 106 endScene.addChild(players2); 107 endScene.addChild(enemys2); 108 109 var endPic = new Sprite(256,48); 110 endPic.image = core.assets['clear.png']; 111 endPic.x = 32; 112 endPic.y = 136; 113 endScene.addChild(endPic); 114 115 var restartButton = new Sprite(100,50); 116 restartButton.image = core.assets['restartbutton.png']; 117 restartButton.x = 35; 118 restartButton.y = 230; 119 endScene.addChild(restartButton); 120 restartButton.ontouchend = function () { 121 state = 0; 122 core.replaceScene(core.startFx()); 123 }; 124 125 var tweetButton = new Sprite(100,50); 126 tweetButton.image = core.assets['tweetbutton.png']; 127 tweetButton.x = 185; 128 tweetButton.y = 230; 129 endScene.addChild(tweetButton); 130 tweetButton.ontouchend = function () { 131 window.open("http://twitter.com/intent/tweet?text=シューティングをプレイ&url=" + url); 132 }; 133 134 return endScene; 135 } 136 137 core.replaceScene(core.startFx()); 138 139 } 140 core.start(); 141} 142 143var Player = enchant.Class.create(enchant.Sprite,{ 144 145 initialize: function(x,y){ 146 enchant.Sprite.call(this,32,32); 147 this.image = core.assets['pic.png']; 148 this.x = x; 149 this.y = y; 150 this.frame = 1; 151 152 this.addEventListener('enterframe', function() { 153 if(state == 1){ 154 if(core.input.left) this.x -= 4; 155 if(core.input.right) this.x += 4; 156 if(core.input.up) this.y -= 4; 157 if(core.input.down) this.y += 4; 158 } 159 }); 160 }, 161}); 162 163var Enemy = enchant.Class.create(enchant.Sprite,{ 164 165 initialize: function(x,y){ 166 enchant.Sprite.call(this,32,32); 167 this.image = core.assets['pic.png']; 168 this.x = x; 169 this.y = y; 170 this.frame = 0; 171 }, 172}); 173 174var PlBul = enchant.Class.create(enchant.Sprite,{ 175 176 initialize: function(x,y){ 177 enchant.Sprite.call(this,32,32); 178 this.image = core.assets['pic.png']; 179 this.x = x; 180 this.y = y; 181 this.frame = 5; 182 183 this.addEventListener('enterframe', function() { 184 if(state == 1){ 185 this.y -= 8; 186 } 187 if(this.x <= 0 || this.x >= 320 || this.y <= 0 || this.y >= 320){ 188 this.remove(); 189 } 190 }) 191 }, 192}); 193 194

追記(4/19 22:30)

javaScript

1 mainScene.addEventListener('enterframe', function(e) { 2 if(core.input.s){ 3 var plbul = new PlBul(players1.x,players1.y - 32); 4 mainScene.addChild(plbul); 5 } 6 if (enemys1.intersect(plbul)) { 7 core.replaceScene(core.endFx(PlX,PlY,EnX,EnY)); 8 } 9 }); 10 return mainScene; 11 } 12

上でも記したこの部分について、
弾が発射されてから少し経った時、plbulをデバッグ画面で見てみると、undifinedになっていました。
Sボタンを押した直後でだけ、plbulが定義されました。

このことから、上記の問題が発生する理由は「plbulが定義されるのは発射した瞬間だけだから」と考えられます。

しかしどのようにすれば、一度定義したplbulを常に定義された状態のままに出来るのかは分かりません。
良ければ知恵をお貸しください。

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

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

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

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

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

guest

回答1

0

自己解決

まず、初めの一文( mainScene.addEventListener('enterframe', function(e) {)よりも上に、var plbul;という一文を挟みました。
するとplbulが定義された状態を維持できて、遠距離射撃をする事が出来ました。

しかし、2つ以上の弾を撃ってしまうと、確かに弾は2つ描写されるのですが、plbulとして認められるのは2つめだけとなってしまい、たとえ初めに撃った弾がenemys1とぶつかっても反応しませんでした。

だから、プログラムを次のように書き換えました。

JavaScript

1 var plbul = []; 2 var PlBulCount = 0; 3 4 mainScene.addEventListener('enterframe', function(e) { 5 6 if(core.input.s){ 7 plbul[PlBulCount] = new PlBul(players1.x,players1.y - 32); 8 mainScene.addChild(plbul[PlBulCount]); 9 PlBulCount = (PlBulCount + 1) % 5; 10 } 11 for(var i = 0; i < 5; i++){ 12 if (enemys1.intersect(plbul[i])) { 13 PlX = players1.x; 14 PlY = players1.y; 15 EnX = enemys1.x; 16 EnY = enemys1.y; 17 core.replaceScene(core.endFx(PlX,PlY,EnX,EnY)); 18 } 19 } 20 }); 21

画面内に同時に映る弾は5つだけだろうと仮定し、その弾全てに0~4の添え字を添付することにしました。
これで上手くいきました。

投稿2020/04/19 14:59

jyarin

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問