シューティングゲームを作っています。
敵に弾を当てたら終了画面を映すプログラムが欲しいのですが、弾を発射した瞬間にだけしか、弾が当たり判定を持ちません。
具体的に言えば、「離れた所から弾を当てても終了画面が映らないが、接射すると終了画面が映る」状態です。
離れた場所から弾を当てても、終了画面を映す方法を教えてください。
コード
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を常に定義された状態のままに出来るのかは分かりません。
良ければ知恵をお貸しください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。