前回、先生のサンプルコードから、配列を使った当たり判定を知ったので、それをつかってブロックくずしのようなものを作ってみました。
ブロックは1200個です。通常のブロック崩しのように跳ね返らず、貫通するので、多くしてみました。どれくらい多くできるのかなとやってみたら、Windowsでは重くなってしましました。
スコアによってだんだん弾のスピードを上げていこうとしましたが、速くすると、タイミングによってはバーをすりぬけてしまうので、断念しました。動くものどうしの衝突判定は色々難しいようです。
クリアすると、「?! 全部消したの?! 想定外です‥」と表示されます。
// Main console.log("Hello EnchantJS!!"); var assets = [ "images/back_space.png", "images/kati_tanuki.png", "images/title.png",// タイトル "sounds/coin.mp3", "sounds/jump.mp3", "images/cf307/baayoko64.png", "images/xe_bullet_r.png", "images/gameover.png", "images/cf307/blueground.png", "sounds/cf307/decision1.mp3", "sounds/cf307/decision3.mp3", "sounds/cf307/rabohyuuu.mp3", "images/gameclear.png", "sounds/cf307/trumpet-dub1.mp3", "sounds/cf307/boyoyon1.mp3", "sounds/cf307/trumpet1.mp3", "sounds/cf307/dondonpafupafu1.mp3", "images/block_d.png", "images/cf307/block8p.png", "sounds/cf307/ME014-090610-loss02-wav.mp3", "sounds/cf307/hit04.mp3", "images/cf307/10_480.png", ]; function gameStart(){// ゲーム画面 scene = gameManager.createGameScene(); core.replaceScene(scene); core.resume(); //========== // ここから //========== scene.backgroundColor = "darkgray"; // 背景 var sky = new ExSprite(320, 480); sky.image = core.assets["images/back_space.png"]; scene.addChild(sky); // 地面 var ground = new ExSprite(320, 55); ground.image = core.assets["images/cf307/blueground.png"]; ground.x = 0; ground.y = 480; scene.addChild(ground); // 壁左 var kabe = new ExSprite(30, 480); kabe.image = core.assets["images/cf307/10_480.png"]; kabe.x = -30; kabe.y = 0; scene.addChild(kabe); kabe.tag = "kabe"; // 壁右 var kabem = new ExSprite(30, 480); kabem.image = core.assets["images/cf307/10_480.png"]; kabem.x = 320; kabem.y = 0; scene.addChild(kabem); kabem.tag = "kabem"; // バー var bar = new ExSprite(64, 6); bar.image = core.assets["images/cf307/baayoko64.png"]; scene.addChild(bar); bar.x = 320 / 2 - 32; bar.y = 480 - 32; bar.tag = "bar"; //bar.scale(10, 0);//テスト用 // 玉グループ var tamaGroup = new Group(); scene.addChild(tamaGroup); // 玉 var tama = new ExSprite(9, 9); tama.image = core.assets["images/xe_bullet_r.png"]; //scene.addChild(tama); tama.x = bar.x + bar.width / 2 - tama.width / 2; tama.y = bar.y - tama.height; tamaGroup.addChild(tama); tama.originX = 0; tama.originY = 0; tama.scale(0.6, 0.6); //tama.scale(4, 4);// テスト用 // 最初の音 var sound0 = core.assets["sounds/cf307/decision3.mp3"].clone(); sound0.play(); // 玉の動き var x1 = getRandom(-320, 640 - tama.width); //var x1 = getRandom(-320, 0);// テスト用 tama.tl.moveTo(x1, -9, 35, enchant.Easing.SINE_EASEOUT); // 最初に跳ね返る音 tama.tl.then(function(){ var sound1 = core.assets["sounds/cf307/decision1.mp3"].clone(); sound1.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 35, enchant.Easing.SINE_EASEOUT); // ブロックグループ var blockGroup = new Group(); scene.addChild(blockGroup); // スコア表示 var score = 0; scoreLabel = new Label('SCORE : 0'); scene.addChild(scoreLabel); scoreLabel.x = 10; scoreLabel.y = 10; scoreLabel.color = 'white'; scoreLabel.font = "24px 'PixelMplus10'"; scoreLabel.addEventListener(Event.ENTER_FRAME, function() { scoreLabel.text = 'SCORE : ' + score; }); // ブロック(繰り返し処理) var blocks = new Array(); for(var i=0; i<1200; i++){ // ブロック var block = new ExSprite(8, 8); block.image = core.assets["images/cf307/block8p.png"]; block.x = 0 + ((i % 40) * 8); block.y = 0 + (Math.floor(i / 40) * 8); blockGroup.addChild(block); block.tag = "b";// タグをつけます blocks.push(block); } // 2, 当たり判定をつけます for(var i=0; i<blocks.length; i++){ tama.addCollision(blocks[i]); } // 当たり判定 tama.addCollision(bar); tama.addCollision(kabe); tama.addCollision(kabem); tama.addEventListener(Event.COLLISION, function(e) { // クリア if(1200 <= score){ tama.remove(); var label6 = new Label("?! 全部消したの?! 想定外です‥"); label6.x = 60; label6.y = 480 / 2 - 16 / 2 + 48; label6.color = "white"; label6.font = "24px 'PixelMplus10'"; scene.addChild(label6); var sound100 = core.assets["sounds/cf307/rabohyuuu.mp3"].clone(); sound100.play(); var clear = new ExSprite(230, 32); clear.image = core.assets["images/gameclear.png"]; scene.addChild(clear); clear.x = 320 / 2 - clear.width / 2; clear.y = 480 / 2 - clear.height; clear.scale(0.5, 0.5); clear.tl.scaleTo(1.4, 1.4, 4); clear.tl.scaleTo(1.2, 1.2, 4); } // 壁にあたったら // 壁左 if(e.collision.target.tag == "kabe"){ tama.tl.clear(); var x1 = getRandom(100, 320 - tama.width); tama.tl.moveTo(x1, -9, 17, enchant.Easing.SINE_EASEOUT); tama.tl.then(function(){ var sound1 = core.assets["sounds/cf307/decision1.mp3"].clone(); sound1.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 35, enchant.Easing.SINE_EASEOUT); } // 壁右 if(e.collision.target.tag == "kabem"){ console.log("kabem"); tama.tl.clear(); var x1 = getRandom(0, 220); tama.tl.moveTo(x1, -9, 17, enchant.Easing.SINE_EASEOUT); tama.tl.then(function(){ var sound1 = core.assets["sounds/cf307/decision1.mp3"].clone(); sound1.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 35, enchant.Easing.SINE_EASEOUT); } // ブロックに当たったら if(e.collision.target.tag == "b"){ e.collision.target.tl.then(function() { e.collision.target.remove();// 消します score += 1; //score += 100; // テスト var sound = core.assets["sounds/cf307/hit04.mp3"].clone(); sound.play(); }); if(1199 <= score){ tama.remove(); var label6 = new Label("?! 全部消したの?! 想定外です‥"); label6.x = 60; label6.y = 480 / 2 - 16 / 2 + 48; label6.color = "white"; label6.font = "24px 'PixelMplus10'"; scene.addChild(label6); var sound100 = core.assets["sounds/cf307/rabohyuuu.mp3"].clone(); sound100.play(); var clear = new ExSprite(230, 32); clear.image = core.assets["images/gameclear.png"]; scene.addChild(clear); clear.x = 320 / 2 - clear.width / 2; clear.y = 480 / 2 - clear.height; clear.scale(0.5, 0.5); clear.tl.scaleTo(1.4, 1.4, 4); clear.tl.scaleTo(1.2, 1.2, 4); } } // バーに当たったら if(e.collision.target.tag == "bar"){ tama.tl.clear(); var x1 = getRandom(-320, 640 - tama.width); tama.tl.moveTo(x1, -9, 35, enchant.Easing.SINE_EASEOUT); tama.tl.then(function(){ var sound = core.assets["sounds/cf307/decision1.mp3"].clone(); sound.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 35, enchant.Easing.SINE_EASEOUT); // 音 var sound2 = core.assets["sounds/cf307/decision3.mp3"].clone(); sound2.play(); //tama.tl.moveTo(160, 471, 16); //テスト用 //score += 500; //テスト用 /* // 球が速くなる if(300<= score && score < 600){ tama.tl.clear(); var x1 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x1, -9, 30, enchant.Easing.SINE_EASEOUT); tama.tl.then(function(){ var sound = core.assets["sounds/cf307/decision1.mp3"].clone(); sound.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 30, enchant.Easing.SINE_EASEOUT); } if(600 <= score && score < 1200){ tama.tl.clear(); var x1 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x1, -9, 27, enchant.Easing.SINE_EASEOUT); tama.tl.then(function(){ var sound = core.assets["sounds/cf307/decision1.mp3"].clone(); sound.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 27, enchant.Easing.SINE_EASEOUT); } if(900 <= score ){ tama.tl.clear(); var x1 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x1, -9, 24, enchant.Easing.SINE_EASEOUT); tama.tl.then(function(){ var sound = core.assets["sounds/cf307/decision1.mp3"].clone(); sound.play(); }); var x2 = getRandom(0, 320 - tama.width); tama.tl.moveTo(x2, 480, 24, enchant.Easing.SINE_EASEOUT); } */ } }); // 画面をタップしてバーを動かす scene.addEventListener(Event.TOUCH_START, function(e){ console.log("タッチ"); console.log(e.x); bar.tl.moveTo(e.x - 32, 480 - 32, 3, enchant.Easing.QUART_EASEINOUT); }); // ゲームオーバー ground.addCollision(tama); ground.addEventListener(Event.COLLISION, function(e) { tama.remove(); var over = new ExSprite(230, 32); over.image = core.assets["images/gameover.png"]; scene.addChild(over); over.x = 320 / 2 - over.width / 2; over.y = 480 / 2 - over.height + 16; over.scale(0.5, 0.5); over.tl.scaleTo(1, 1, 8); var sound = core.assets["sounds/cf307/ME014-090610-loss02-wav.mp3"].clone(); sound.play(); over.tl.then(function() { var label = new Label(" TAP TO RETRY"); label.color = 'red'; label.font = "28px 'PixelMplus10'"; label.textAlign = "center"; label.y = 220 + 100; scene.addChild(label); scene.addEventListener(Event.TOUCH_START, function() { gameStart(); }); }); }); //========== // ここまで //========== } function getRandom(start, end) { return start + Math.floor( Math.random() * (end - start + 1)); } function titleStart(){// タイトル画面 var scene = gameManager.createTitleScene(); core.replaceScene(scene); core.pause(); scene.on(enchant.Event.TOUCH_START, function(){gameStart();}); } //========== // EnchantJS enchant(); var gameManager; var core; var scene; window.onload = function(){ gameManager = new common.GameManager(); core = gameManager.createCore(320, 480); core.preload(assets); core.onload = function(){titleStart();}; core.start(); }