/* * おまじない */ enchant(); window.focus(); var _DIR_ = SwitchApps.scriptDir(); /* * 定数 */ // パラメータ var SCREEN_W = window.screen.width; //スクリーンの幅 var SCREEN_H = window.screen.height; //スクリーンの高さ if(window.navigator.platform == "iPad") { var SCREEN_W = $(window).width(); //スクリーンの幅 var SCREEN_H = $(window).height()-44; //スクリーンの高さ } // 背景 // SE、BGM var HANABI_SE0 = _DIR_ + "/sounds/se0.mp3"; var HANABI_SE1 = _DIR_ + "/sounds/seA.mp3"; //var HANABI_SE2 = "game/app003/sounds/seB.mp3"; //var BGM1 = ""; // アセットリスト var ASSETS = [ HANABI_SE0, HANABI_SE1//,HANABI_SE2 ]; /* * グローバル変数 */ var game = null; var logger = null; var hanabi_max = 5; // 一度に上がる花火の上限 var touch_cnt = 0; //クリック・タッチの回数を数える $(document).ready(function(){ logger = new SwitchApps.Logger(SwitchApps.app.id, null); //$('#setting-button').remove(); /*ログの設定*/ LOG_switch = logger.addHeader('スイッチ入力'); LOG_uchiage = logger.addHeader('花火打ち上げ'); LOG_hiraku = logger.addHeader('花火開く'); /*AIUEO = {set:2}, createSettingBox("a","a",AIUEO,40,"a","s","d");*/ }); /* * 汎用処理 */ //ランダム値生成 var randfloat = function(min, max) { return Math.random()*(max-min)+min; }; //キーバインド設定 var keyset = function(key){ game.keybind(key, 'a'); //aボタン(「z」キー)を押した時のイベント処理 game.currentScene.onabuttondown = function() { var ev = new Event('touchstart'); // 発火! game.currentScene.dispatchEvent(ev); }; }; // 1つ1つの粒の情報 function particle(x_pos, y_pos, radius, speed, angle, damp, phase){ //コンストラクタ(もどき) this.x_pos = x_pos; // x座標 this.y_pos = y_pos; // y座標 this.radius = radius*3; // 大きさ this.speed = speed; // 速さ this.angle = Math.PI*2*angle/360; // 角度(引数は0-360度) this.damp = damp; // 減衰力 this.phase = phase; // 属するフェーズ this.x_vel = Math.cos(this.angle)*this.speed; // x軸方向の速度 this.y_vel = -Math.sin(this.angle)*this.speed; // y軸方向の速度 } /* * メイン処理 */ window.onload = function() { //ゲームオブジェクトの生成 game = new Core(SCREEN_W, SCREEN_H); // SE、画像の読み込み game.preload(ASSETS); //ゲーム開始時の処理 game.onload = function() { var scene = game.rootScene; scene.backgroundColor = "black"; // キーバインドの設定 keyset(49); //1キー keyset(51); //3キー keyset(32); //spaceキー keyset(10); //Enter1 keyset(13); //Enter windows keyset(123); //F12キー // 花火を描画するためのキャンバス var canvas = new Sprite(SCREEN_W, SCREEN_H); canvas.surface = new Surface(SCREEN_W, SCREEN_H); canvas.image = canvas.surface; // シーンに追加 scene.addChild(canvas); // コンテキストを取得(描画可能にする) canvas.context = canvas.surface.context; // 花火データ canvas.particle = new Array(); canvas.hanabi_num = 0; canvas.cnt = new Array(); canvas.phase = new Array(hanabi_max); canvas.pos = new Array(hanabi_max); for(var i = 0; i < hanabi_max; i++){ canvas.phase[i] = 0; } canvas.r2 = new Array(); canvas.g2 = new Array(); canvas.b2 = new Array(); canvas.r3 = new Array(); canvas.g3 = new Array(); canvas.b3 = new Array(); // SE設定 canvas.se0 = game.assets[HANABI_SE0]; canvas.se1 = game.assets[HANABI_SE1]; // タッチイベント追加 scene.addEventListener(Event.TOUCH_START, launch); function launch(e) { if(canvas.hanabi_num < hanabi_max){ startPhase1(e); } } canvas.addEventListener(Event.ENTER_FRAME, update); function update() { //console.log("粒配列の数 :"+canvas.cnt); // canvas全体を半透明の黒で薄める canvas.context.beginPath(); canvas.context.fillStyle = 'rgba(0, 0, 0, 0.3)'; canvas.context.fillRect(0, 0, SCREEN_W, SCREEN_H); // パーティクルの描画 for(var h = 0, n = canvas.particle.length; n > h; h++){ for(var i = 0, m = canvas.particle[h].length; m > i; i++){ /* 色つきの粒の後に描画する // パスのリセット canvas.context.beginPath(); // 円の描写 canvas.context.arc(canvas.particle[i].x_pos, canvas.particle[i].y_pos, canvas.particle[i].radius, 0, 2*Math.PI, true); // 円の内部の色を指定し描写 canvas.context.fillStyle = 'rgba(255, 255, 255, 1)'; canvas.context.fill(); */ if(canvas.particle[h][i].phase == 3){ // パスのリセット canvas.context.beginPath(); // 円の描写 canvas.context.arc(canvas.particle[h][i].x_pos+canvas.particle[h][i].x_vel, canvas.particle[h][i].y_pos+canvas.particle[h][i].y_vel+3, 2, 0, 2*Math.PI, true); // 円の内部の色を指定し描写 canvas.context.fillStyle = 'rgba(0, 0, 0, 1)'; canvas.context.fill(); // パスのリセット canvas.context.beginPath(); // 円の描写 canvas.context.arc(canvas.particle[h][i].x_pos+canvas.particle[h][i].x_vel+canvas.particle[h][i].x_vel*0.96, canvas.particle[h][i].y_pos+canvas.particle[h][i].y_vel+canvas.particle[h][i].y_vel*0.96+6, 2, 0, 2*Math.PI, true); // 円の内部の色を指定し描写 canvas.context.fillStyle = 'rgba('+canvas.r3[h]+','+canvas.g3[h]+','+canvas.b3[h]+', 1)'; canvas.context.fill(); } if(canvas.particle[h][i].phase == 2){ // パスのリセット canvas.context.beginPath(); // 円の描写 canvas.context.arc(canvas.particle[h][i].x_pos+canvas.particle[h][i].x_vel, canvas.particle[h][i].y_pos+canvas.particle[h][i].y_vel+3, 2, 0, 2*Math.PI, true); // 円の内部の色を指定し描写 canvas.context.fillStyle = 'rgba(0, 0, 0, 1)'; canvas.context.fill(); // パスのリセット canvas.context.beginPath(); // 円の描写 canvas.context.arc(canvas.particle[h][i].x_pos+canvas.particle[h][i].x_vel+canvas.particle[h][i].x_vel*0.96, canvas.particle[h][i].y_pos+canvas.particle[h][i].y_vel+canvas.particle[h][i].y_vel*0.96+6, 2, 0, 2*Math.PI, true); // 円の内部の色を指定し描写 canvas.context.fillStyle = 'rgba('+canvas.r2[h]+','+canvas.g2[h]+','+canvas.b2[h]+', 1)'; canvas.context.fill(); } // パスのリセット canvas.context.beginPath(); // 円の描写 canvas.context.arc(canvas.particle[h][i].x_pos, canvas.particle[h][i].y_pos, canvas.particle[h][i].radius, 0, 2*Math.PI, true); // 円の内部の色を指定し描写 canvas.context.fillStyle = 'rgba(255, 255, 255, 1)'; canvas.context.fill(); } // パーティクルの値を更新andフェーズ切り替え判定 switch(canvas.phase[h]){ case 0: break; case 1: phase1(h); checkPhase1(h); break; case 2: phase2(h); checkPhase2(h); break; case 3: phase3(h); checkPhase3(h); break; default: break; } } } // フェーズの開始にパーティクルを追加 function startPhase1(e) { LOG_switch(); // 画面タッチの回数を1増やす touch_cnt++; // 画面全体の花火の数を1増やす canvas.hanabi_num++; // 花火の粒配列を生成 var num = (touch_cnt-1)%hanabi_max; while(canvas.phase[num] != 0 ){ touch_cnt++; num = (touch_cnt-1)%hanabi_max; } canvas.particle[num] = new Array(); canvas.cnt[num] = 0; canvas.pos[num] = randfloat(0.4, 0.8); // フェーズフラグを更新 canvas.phase[num] = 1; // 打ち上げ開始座標を決める var x = e.x; var y = e.y; if(x == 0){ x = randfloat(SCREEN_W*0.2, SCREEN_W-SCREEN_W*0.2)|0; } if(y == 0){ y = SCREEN_H; } // 粒の生成 canvas.particle[num][0] = new particle(x, y, 5, 10, 90, 1, 1); canvas.cnt[num] = 1; // SE LOG_uchiage(); canvas.se0.clone().play(); } function startPhase2(num) { // フェーズフラグを更新 canvas.phase[num] = 2; // 爆発中心位置 var x = canvas.particle[num][0].x_pos; var y = canvas.particle[num][0].y_pos; // 花火の色を決定d canvas.r2[num] = randfloat(0, 255)|0; canvas.g2[num] = randfloat(0, 255)|0; canvas.b2[num] = randfloat(0, 255)|0; // 粒の生成 for(var i=1; i <= 120; i++) { var speed = Math.random()*10; var angle = Math.random()*360; canvas.particle[num][canvas.cnt[num]] = new particle(x, y, 5, speed, angle, 0.94, 2); canvas.cnt[num]++; } // フェーズ1パーティクルを消す canvas.particle[num][0].radius = 0; // SE LOG_hiraku(); canvas.se1.clone().play(); } function startPhase3(num) { // フェーズフラグを更新 canvas.phase[num] = 3; // 爆発中心位置 var x = canvas.particle[num][0].x_pos; var y = canvas.particle[num][0].y_pos; var xi = yi = 0; //やっつけ var cnt = 0; // 花火の色を決定 canvas.r3[num] = randfloat(0, 255)|0; canvas.g3[num] = randfloat(0, 255)|0; canvas.b3[num] = randfloat(0, 255)|0; // 粒の生成 function circleFire() { xi = randfloat(x-150, x+150)|0; yi = randfloat(y-120, y+120)|0; for(var i=1; i <= 20; i++) { var speed = 5; var angle = i*18; canvas.particle[num][canvas.cnt[num]] = new particle(xi, yi, 5, speed, angle, 0.95, 3); canvas.cnt[num]++; } // SE canvas.se1.clone().play(); // 一定数出したら終わる cnt++; if(cnt <= 6){ setTimeout(circleFire, 100); } } circleFire(); // 入力した分だけ円花火が出るようにする /* scene.removeEventListener(Event.TOUCH_START, launch); scene.addEventListener(Event.TOUCH_START, circleFire); */ } /* function circleFire() { // 爆発中心位置 var x = canvas.particle[0].x_pos; var y = canvas.particle[0].y_pos; var xi = randfloat(x-170, x+170)|0; var yi = randfloat(y-120, y+120)|0; for(var i=1; i <= 20; i++) { var speed = 5;//Math.random()*10; var angle = i*18;//Math.random()*360; canvas.particle[canvas.cnt] = new particle(xi, yi, 2, speed, angle, 0.95, 3); canvas.cnt++; } // SE canvas.se1.clone().play(); } */ function startPhaseEnd(num) { // フェーズフラグを更新 canvas.phase[num] = 0 // 花火の粒配列を初期化 canvas.particle[num] = new Array(); // 画面全体の花火の数を1減らす canvas.hanabi_num--; // イベントを元に戻す /* scene.addEventListener(Event.TOUCH_START, launch); scene.removeEventListener(Event.TOUCH_START, circleFire); */ } // フェイズ毎にパーティクル値を更新 function phase1(num) { canvas.particle[num][0].y_pos += canvas.particle[num][0].y_vel; /* for(var i = 0, n = canvas.particle.length; n > i; i++){ canvas.particle[i].y_pos -= 10; }*/ } function phase2(num) { for(var i = 1, n = canvas.particle[num].length; n > i; i++){ canvas.particle[num][i].x_pos += canvas.particle[num][i].x_vel; canvas.particle[num][i].y_pos += canvas.particle[num][i].y_vel; canvas.particle[num][i].y_pos += 1.5; // 重力 canvas.particle[num][i].x_vel *= canvas.particle[num][i].damp; // 減衰力 canvas.particle[num][i].y_vel *= canvas.particle[num][i].damp; // 減衰力 canvas.particle[num][i].radius *= canvas.particle[num][i].damp; // 減衰力 // 余韻を残すためある程度小さくなったら減衰力を減らす if(canvas.particle[num][i].radius < 0.7){ canvas.particle[num][i].damp = 0.96; } } } function phase3(num) { for(var i = 1, n = canvas.particle[num].length; n > i; i++){ canvas.particle[num][i].x_pos += canvas.particle[num][i].x_vel; canvas.particle[num][i].y_pos += canvas.particle[num][i].y_vel; canvas.particle[num][i].y_pos += 2; // 重力 canvas.particle[num][i].x_vel *= canvas.particle[num][i].damp; // 減衰力 canvas.particle[num][i].y_vel *= canvas.particle[num][i].damp; // 減衰力 canvas.particle[num][i].radius *= canvas.particle[num][i].damp; // 減衰力 // 余韻を残すためある程度小さくなったら減衰力を減らす if(canvas.particle[num][i].radius < 0.7){ canvas.particle[num][i].damp = 0.97; } } } // フェーズ切り替え判定 function checkPhase1(num) { // phase1 → phase2 if(canvas.particle[num][0].y_pos < SCREEN_H-(SCREEN_H*canvas.pos[num])){ startPhase2(num); } } function checkPhase2(num) { // phase2 → phase3 if(canvas.particle[num][1].radius <= 0.3){ startPhase3(num); } if(canvas.particle[num][1].radius <= 0.1){ if(canvas.particle[num][i].phase == 2){ canvas.particle[num][i].phase = 0; } } } function checkPhase3(num) { // phase3 → end var flg = 0; // 1でphase3へ移行 // パーティクル毎にチェック、すべてのパーティクルが終了したらフラグを1に for(var i = 0, n = canvas.particle[num].length; n > i; i++){ flg = 1; if(canvas.particle[num][i].radius <= 0.3){ canvas.particle[num][i].radius = 0; canvas.particle[num][i].phase = 0; }else { flg = 0; } } if(flg == 1){ startPhaseEnd(num); } } } game.start(); };