恐怖ももちゃんサバイバル(解説)

いがぐりをたくさん出してみたら、あまりに気持ち悪く、そのままでは耐えられなかったので白くしてみたらウイルスっぽかったので、思いつきました。

ういるすは画面上いっぱいの範囲でランダムに出ますが、いきなりももちゃんに重なってしまうとそこですぐ終わってしまいます。

そこで、重ならないように出す工夫をしました。

まず、ウイルスを画面内のランダムの位置に出します。

 var igaguri = new ExSprite(32, 32);
 igaguri.image = core.assets["images/cf307/igagurikurugray.png"];
 igaguriGroup.addChild(igaguri);
 igaguri.tag = "いがぐり"; 
 igaguri.frame = [0, 1, 2, 3];
 var x1 = getRandom(0, 320 - 32);
 igaguri.x = x1;
 var y1 = getRandom(0, 480 - 32);
 igaguri.y = y1; 

ここで、ウイルスの出現する座標は、ランダムに指定される(x1, y1)です。

ももちゃんにいきなり重ならないように、ここでランダムの位置が重なる値ならば、重ならない値に変更するようにします。

if(momo.x - 32 <= x1 && x1 <= momo.x + 32){
    igaguri.x = x1 - 64;
}
if(momo.y - 32 <= y1 && y1 <= momo.y + 32){
    igaguri.y = y1 + 64;
} 

もしもウイルスがももちゃんの座標の周囲32ピクセル以内に入りそうなら、64ピクセル離れた座標にする、ということをしています。こうすれば、重なることがありません。

そして、ウイルスをももちゃんに向かってじわじわ接近させ、消します。

igaguri.tl.moveTo(momo.x, momo.y, 100); 
igaguri.tl.then(function(){      
    igaguri.remove();     
});       

以上を3カウント毎に繰り返す(3カウントに一個ずつのタイミングで、ウイルスを画面のどこかに出現させる)ので、合わせて以下のようになります。

// ももちゃんに被らないようにいがぐりを出す
var d = 3;
scene.tl.delay(d). then(function(){
    var igaguri = new ExSprite(32, 32);
    igaguri.image = core.assets["images/cf307/igagurikurugray.png"];
    igaguriGroup.addChild(igaguri);
    igaguri.tag = "いがぐり";
    igaguri.frame = [0, 1, 2, 3];
    var x1 = getRandom(0, 320 - 32);
    console.log(x1);        
    igaguri.x = x1;
    console.log(igaguri.x);
    var y1 = getRandom(0, 480 - 32);
    console.log(y1); 
    igaguri.y = y1;
    console.log(igaguri.y);
    if(momo.x - 32 <= x1 && x1 <= momo.x + 32){
        igaguri.x = x1 - 64;
        console.log("igaguri.x");
    }
    if(momo.y - 32 <= y1 && y1 <= momo.y + 32){
        igaguri.y = y1 + 64;
    }    
    igaguri.tl.moveTo(momo.x, momo.y, 100);
    igaguri.tl.then(function(){
        igaguri.remove();
    });           
});
scene.tl.loop();

お薬も同じようにして、ももちゃんに重ならないように出します。

完成したソースコード

// Main
console.log("Hello EnchantJS!!");

var assets = [
    "images/e_tanuki.png",
    "images/title.png",// タイトル
    "sounds/hit.mp3",
    "sounds/jump.mp3",
    "images/cf307/momo.png", 
    "images/cf307/igagurikurugray.png",
    "sounds/cf307/jump12.mp3",
    "sounds/cf307/pyu15.mp3",
    "images/cf307/momochanzannen.png",
    "images/cf307/igaguri.png",
    "sounds/cf307/se_maoudamashii_onepoint31.mp3",
    "images/title_gameover.png",
    "images/cf307/okusuri.png",
    "sounds/cf307/correct2.mp3",
    "images/cf307/retrybotan.png",
    "images/cf307/sikibutonn.png",
    "images/cf307/kakebutonn.png",
    "images/cf307/hyounoua.png",
    "images/title_gameclear.png",
    "images/cf307/tarunohuroue.png",
    "images/cf307/tarunohurosita.png",
    "images/cf307/yuge.png",
    "images/cf307/sizuku0.png",
    "sounds/cf307/water-dopon1.mp3",
    "sounds/cf307/jump03.mp3",
    "sounds/fall.mp3",
    "sounds/cf307/clear04.mp3",
    "images/cf307/tenugui.png",
    "images/cf307/momobotann.png",
    "images/joe_gass.png",
    "sounds/gass.mp3",
    "sounds/cf307/water-bukubuku3.mp3",
    "sounds/cf307/bath-thapon1.mp3",
    "sounds/cf307/matchstick-put-fire1.mp3",
    "sounds/cf307/boyon1.mp3",
    "sounds/cf307/jump02.mp3",
];

function gameStart(){// ゲーム画面
    scene = gameManager.createGameScene();
    core.replaceScene(scene); core.resume();

    //==========
    // ここから
    //==========

    scene.backgroundColor = "orange";
    // ももちゅあんグループ 
    var momoGroup = new Group();
    scene.addChild(momoGroup);

    // ウイルスグループ
    var igaguriGroup = new Group();
    scene.addChild(igaguriGroup);
    
    // 薬グループ
    var kusuriGroup = new Group();
    scene.addChild(kusuriGroup);

    // ももちゃん
    var momo = new ExSprite(32, 32);
    momo.image = core.assets["images/cf307/momo.png"];
    momo.x = 320 /2 - 16;
    momo.y = 128 + 32 * 3 + 16;
    scene.addChild(momo);
    momo.frame = [0, 0, 1, 1, 2, 2]; 
  
    // 薬グループ1
    var kusuriGroup1 = new Group();
    scene.addChild(kusuriGroup1);

    // ももちゃん移動
    scene.addEventListener(Event.TOUCH_START, function(e){
        momo.moveTo(e.x - 16, e.y - 16, 0);
        console.log(e.y);
        var sound = core.assets["sounds/cf307/jump12.mp3"].clone();
        sound.play();
    });

    // ももちゃんに被らないようにいがぐりを出す
    var d = 3;
    scene.tl.delay(d). then(function(){
        var igaguri = new ExSprite(32, 32);
        igaguri.image = core.assets["images/cf307/igagurikurugray.png"];
        igaguriGroup.addChild(igaguri);
        igaguri.tag = "いがぐり";
        igaguri.frame = [0, 1, 2, 3];
        var x1 = getRandom(0, 320 - 32);
        console.log(x1);        
        igaguri.x = x1;
        console.log(igaguri.x);
        var y1 = getRandom(0, 480 - 32);
        console.log(y1); 
        igaguri.y = y1;
        console.log(igaguri.y);
        if(momo.x - 32 <= x1 && x1 <= momo.x + 32){
            igaguri.x = x1 - 64;
            console.log("igaguri.x");
        }
        if(momo.y - 32 <= y1 && y1 <= momo.y + 32){
            igaguri.y = y1 + 64;
        }    
        igaguri.tl.moveTo(momo.x, momo.y, 100);
        igaguri.tl.then(function(){
           igaguri.remove();
        });           
    });
    scene.tl.loop();

    // ももちゃんに被らないように薬を出す
    momo.tl.delay(32).then(function(){
        var kusuri = new ExSprite(32, 32);
        kusuri.image = core.assets["images/cf307/okusuri.png"];
        var x2 = getRandom(0, 320 - 32);
        kusuri.x = x2;
        var y2 = getRandom(0, 480 - 32);
        kusuri.y = y2;
        kusuriGroup.addChild(kusuri);
       kusuri.tag = "くすり";  
        if(momo.x - 32 <= x2 && x2 <= momo.x + 32){
            kusuri.x = x2 - 64;
        }
        if(momo.y - 32 <= y2 && y2 <= momo.y + 32){
            kusuri.y = y2 + 64;
        }    
        kusuri.tl.delay(16).then(function(){
            kusuri.remove();
        }); 
    }); 
    momo.tl.loop();
    
    // ウイルスか薬か
    momo.addCollision(igaguriGroup);
    momo.addCollision(kusuriGroup);
    momo.addEventListener(Event.COLLISION, function(e) {
        scene.tl.clear();
        console.log(e.collision.target.tag);
        // ウイルス
        if (e.collision.target.tag == "いがぐり") {
        kusuriGroup.remove();      
        igaguriGroup.remove();
        momo.remove();
        var momoz = new ExSprite(32, 32);
        momoz.image = core.assets['images/cf307/momochanzannen.png'];
        momoz.x = momo.x;
        momoz.y = momo.y;
        momoGroup.addChild(momoz);
        // グサッ
        var sound = core.assets["sounds/cf307/pyu15.mp3"].clone();
        sound.play(); 
        // ウイルスの動き
        var asteroid = new ExSprite(32, 32);
        asteroid.image = core.assets["images/cf307/igagurikurugray.png"];
        asteroid.x = momo.x + 25;
        asteroid.y = momo.y + 18;
        scene.addChild(asteroid);
        asteroid.tl.moveBy(-5, -10, 2);
     // ももちゃん落ちていく
        asteroid.tl.delay(8).then(function(){             
            momoz.tl.moveBy(0, -25, 3);                 
            momoz.tl.delay(3).then(function(){
                var sound = core.assets["sounds/fall.mp3"].clone();
            sound.play();                
            });   
            momoz.tl.rotateBy(720, 20).and().moveBy(0, 480, 20, enchant.Easing.QUAD_EASEIN);           
            momoz.tl.then(function() {
                gameOver();
            });
         });
    }
       // 薬ゲット 
       if (e.collision.target.tag == "くすり") {
            igaguriGroup.remove();
            kusuriGroup.remove();
            // ピンポン
            var sound = core.assets["sounds/cf307/correct2.mp3"].clone();
            sound.play();
            var kusuri = new ExSprite(32, 32);
            kusuri.image = core.assets["images/cf307/okusuri.png"]; 
            kusuriGroup1.addChild(kusuri);
            kusuri.x = momo.x ;
            kusuri.y = momo.y + 5;
            kusuri.tl.rotateBy(270, 6).and().scaleTo(0.1, 0.1, 6);
            // ももちゃんジャンプ 
            kusuri.tl.then(function(){
                kusuri.remove();
                momo.tl.moveBy(0, 15, 6, enchant.Easing.QUAD_EASEOUT);
                momo.tl.then(function(){
                    var sound = core.assets["sounds/cf307/jump03.mp3"].clone();
                    sound.play();
                });
                momo.tl.moveBy(0, -480, 20, enchant.Easing.QUAD_EASEIN);                
                momo.tl.then(function(){
                    gameClear();
                });
            });   
        }      
    });

    //==========
    // ここまで
    //==========
}

function gameOver(){// ゲームオーバー画面
    scene = gameManager.createGameScene();
    core.replaceScene(scene); core.resume();

    //==========
    // ここから
    //==========

    scene.backgroundColor = "orange";

    // 敷ふとん
    var siki = new ExSprite(64, 64);
    siki.image = core.assets['images/cf307/sikibutonn.png'];
    siki.x = 0;
    siki.y = 480;
    scene.addChild(siki);
    siki.tl.moveTo(320 / 2 - 32, 200 - 10, 14).and().scaleTo(2, 2, 14).and().rotateBy(360, 14);
    
    // ざんねんももちゃん
    var momoz = new ExSprite(32, 32);
    momoz.image = core.assets['images/cf307/momochanzannen.png'];
    momoz.x = 320 / 2 - 16;
    momoz.y = 0;
    scene.addChild(momoz);
    momoz.tl.moveTo(320 / 2 - 16, 400 / 2 - 16, 16, enchant.Easing.QUAD_EASEOUT).and().scaleTo(2, 2, 16).and().rotateBy(360, 16);
    
    // 掛けぶとん     
    var kake = new ExSprite(64, 64);
    kake.image = core.assets['images/cf307/kakebutonn.png'];
    kake.x = 320;
    kake.y = 0;
    scene.addChild(kake);
    kake.tl.moveTo(320 / 2 - 32, 200 - 6, 18).and().scaleTo(2, 2, 18).and().rotateBy(-360, 18);
    
    // ふとん掛けたら音
    kake.tl.then(function(){
        var sound = core.assets["sounds/cf307/se_maoudamashii_onepoint31.mp3"].clone();
        sound.play();
    }); 

    // 氷嚢
    scene.tl.delay(24).then(function(){
        var hyou = new ExSprite(60, 50);
        hyou.image = core.assets['images/cf307/hyounoua.png'];
        hyou.x = 320 / 2 - 30;
        hyou.y = 0;
        scene.addChild(hyou);
        hyou.scale(0.5, 0.5);
        hyou.tl.moveTo(320 / 2 - 30, 400 / 2 - 53, 5,enchant.Easing.BOUNCE_EASEOUT);
        hyou.tl.then(function(){
            var sound = core.assets["sounds/cf307/boyon1.mp3"].clone();
        sound.play();
        });
    });
   
    // お大事に
    var label1 = new Label("  お大事に‥");
    label1.color = 'black';
    label1.font = "30px 'PixelMplus10'";
    label1.textAlign = "center";
    label1.y = 330; 
    scene.addChild(label1); 
  
    // ゲームオーバーを表示
    var gameover = new ExSprite(147, 48);
    gameover.image = core.assets['images/title_gameover.png'];
    gameover.x = 320 / 2 - gameover.width/2;
    gameover.y = 50;
    scene.addChild(gameover);
    // 大きく
    gameover.scale(0.5, 0.5);
    gameover.tl.scaleTo(1.5, 1.5, 20); 
        
    // リトライボタン
    var retry = new ExSprite(62, 55);
    retry.image = core.assets["images/cf307/retrybotan.png"];
    scene.addChild(retry);
    retry.x = 320 / 2 - retry.width / 2;
    retry.y = 350 ;
    retry.tl.moveBy(0, 50, 20);
    // ボタンをタッチ
   retry.addEventListener(Event.TOUCH_START, function(){
        retry.frame = 1;
        console.log("タッチしました");
    });
    retry.addEventListener(Event.TOUCH_END, function(){
        retry.frame = 0;
        gameStart();
    });

    //==========
    // ここまで
    //==========
}

function gameClear(){// ゲームクリア画面
    scene = gameManager.createGameScene();
    core.replaceScene(scene); core.resume();

    //==========
    // ここから
    //==========

    scene.backgroundColor = "orange";

    // 
    var sound = core.assets["sounds/cf307/clear04.mp3"].clone();
    sound.play();

    // 湯気
    var yuge = new ExSprite(64, 18);
    yuge.image = core.assets['images/cf307/yuge.png'];
    yuge.x = 320 / 2 - 32;
    yuge.y = 200 - 10 - 50;
    scene.addChild(yuge);
    yuge.tl.scaleTo(2, 2, 10);
    yuge.frame = [0, 0, 1, 1, 2, 2, 3, 3];

    // お風呂の上
    var huroue = new ExSprite(64, 19);
    huroue.image = core.assets['images/cf307/tarunohuroue.png'];
    huroue.x = 320 / 2 - 32;
    huroue.y = 200 - 10;
    scene.addChild(huroue);
    huroue.tl.scaleTo(2, 2, 10);

    // しずくグループ
    var sizukuGroup = new Group();
    scene.addChild(sizukuGroup);

    // ももちゃん
    var momo = new ExSprite(32, 32);
    momo.image = core.assets["images/cf307/momo.png"];
    momo.x = 320 / 2 - 16;
    momo.y = 0;
    scene.addChild(momo);
    momo.frame = [0, 0, 1, 1, 2, 2]; 
    momo.tl.moveTo(320 / 2 - 16, 400 / 2 - 8, 16, enchant.Easing.QUAD_EASEOUT).and().scaleTo(2, 2, 16);
    momo.tl.then(function(){
        momo.tl.moveBy(0, -5, 3);
        // しぶき
        var sizuku = new ExSprite(32, 32);
        sizuku.image = core.assets["images/cf307/sizuku0.png"];
        sizuku.x = momo.x;
        sizuku.y = momo.y;
        scene.addChild(sizuku);
        sizuku.scale(3, 3);             
        sizuku.frame = [0, 1, 2, 3, 4, null];
        var sound = core.assets["sounds/cf307/water-dopon1.mp3"].clone();
        sound.play();
        momo.tl.delay(3).then(function(){
            momo.tl.moveBy(0, 3, 6, enchant.Easing.QUAD_EASEOUT);
            momo.tl.moveBy(0, -3, 6, enchant.Easing.QUAD_EASEOUT);   
            momo.tl.loop();      
        });
        sizuku.tl.delay(24).then(function(){
            var sizuku = new ExSprite(32, 32);
            sizuku.image = core.assets["images/cf307/sizuku0.png"];
            sizuku.x = momo.x;
            sizuku.y = momo.y;
            sizukuGroup.addChild(sizuku);
            sizuku.scale(3, 3);             
            sizuku.frame = [0, 1, 2, 3, 4, null];
            var sound = core.assets["sounds/cf307/bath-thapon1.mp3"].clone();
            sound.play();
        });
        sizuku.tl.loop();
    }); 

    // てぬぐい
    scene.tl.delay(25).then(function(){
        var tenugui = new ExSprite(32, 16);
        tenugui.image = core.assets['images/cf307/tenugui.png'];
        tenugui.x = 320 / 2 - 16;
        tenugui.y = 0;
        scene.addChild(tenugui);
        tenugui.scale(1.3, 1.3);
        tenugui.tl.moveTo(320 / 2 - 16, 400 / 2 - 8 - 13, 6,enchant.Easing.QUAD_EASEOUT);
        tenugui.tl.then(function(){
            var sound = core.assets["sounds/cf307/jump02.mp3"].clone();
        sound.play();
        });   
        tenugui.tl.delay(3).then(function(){
            tenugui.tl.moveBy(0, 3, 6, enchant.Easing.QUAD_EASEOUT);
            tenugui.tl.moveBy(0, -3, 6, enchant.Easing.QUAD_EASEOUT);   
            tenugui.tl.loop();      
        });
    });  
 
    // お風呂の下
    var hurosita = new ExSprite(64, 64);
    hurosita.image = core.assets['images/cf307/tarunohurosita.png'];
    hurosita.x = 320 / 2 - 32;
    hurosita.y = 200  - 10 + 19;
    scene.addChild(hurosita);
    hurosita.tl.scaleTo(2, 2, 10);

    // Thank You
    var label1 = new Label("  THANK YOU!");
    label1.color = 'black';
    label1.font = "30px 'PixelMplus10'";
    label1.textAlign = "center";
    label1.y = 330; 
    scene.addChild(label1);

    // ゲームクリアを表示
    var gameclear = new ExSprite(147, 48);
    gameclear.image = core.assets['images/title_gameclear.png'];
    gameclear.x = 320 / 2 - gameclear.width/2;
    gameclear.y = 50;
    scene.addChild(gameclear);
    // 大きく
    gameclear.scale(0.5, 0.5);
    gameclear.tl.scaleTo(1.5, 1.5, 20); 
        
    // リトライボタン
    var retry = new ExSprite(62, 55);
    retry.image = core.assets["images/cf307/retrybotan.png"];
    scene.addChild(retry);
    retry.x = 320 / 2 - retry.width / 2;
    retry.y = 350 ;
    retry.tl.moveBy(0, 50, 20);  
    // ボタンをタッチ
   retry.addEventListener(Event.TOUCH_START, function(){
        retry.frame = 1;
        console.log("タッチしました");
    });
    retry.addEventListener(Event.TOUCH_END, function(){
        retry.frame = 0;
        gameStart();
    });

    // おまけボタン       
    var botan = new ExSprite(64, 64);
    botan.image = core.assets["images/cf307/momobotann.png"];
    scene.addChild(botan);
    botan.x = 320 - 64;
    botan.y = 480 - 64;
    botan.originX = 64;
    botan.originY = 64;
    botan.scale(0.1, 0.1);
    botan.tl.scaleTo(0.5, 0.5, 20);

   // もう一回の文字
    var label3 = new Label("おまけ");
    label3.color = 'black';
    label3.font = "10px 'PixelMplus10'";
    scene.addChild(label3);
    label3.x = 320 - 58;
    label3.y = 480 - 20;                 
    label3.scale(0.1, 0.1);
    label3.tl.scaleTo(0.8, 0.8, 20);
    // ボタンをタッチ
   botan.addEventListener(Event.TOUCH_START, function(){
        botan.frame = 1;
        label3.tl.moveBy(0, 6, 0);
        console.log("タッチしました");     
    });
    botan.addEventListener(Event.TOUCH_END, function(){
        botan.frame = 0;
        label3.tl.moveBy(0, -6, 0);
        // ももちゃんブッ 
        var sound = core.assets["sounds/gass.mp3"].clone();
        sound.play();
        label3.tl.delay(5).then(function(){
            var bomb = new ExSprite(32, 32);
            bomb.image = core.assets["images/joe_gass.png"];
            bomb.x = momo.x + 32;
            bomb.y = momo.y - 32;
            scene.addChild(bomb);
        bomb.scale(2, 2);       
            bomb.frame = [0, 1, 2, 3, 4, null]; 
            var sound = core.assets["sounds/cf307/water-bukubuku3.mp3"].clone();
            sound.play();              
        });                 
   });

    // ラべるをタッチ
    label3.addEventListener(Event.TOUCH_START, function(){
        botan.frame = 1;
        label3.tl.moveBy(0, 6, 0);
        console.log("タッチしました");
    });
    label3.addEventListener(Event.TOUCH_END, function(){
        botan.frame = 0;
        label3.tl.moveBy(0, -6, 0);
        // ももちゃんブッ 
        var sound = core.assets["sounds/gass.mp3"].clone();
        sound.play();
        label3.tl.then(function(){          
            var sound = core.assets["sounds/cf307/water-bukubuku3.mp3"].clone();
            sound.play();
        });
        label3.tl.delay(10).then(function(){
            var bomb = new ExSprite(32, 32);
            bomb.image = core.assets["images/joe_gass.png"];
            bomb.x = momo.x + 32;
            bomb.y = momo.y - 32;
            scene.addChild(bomb);
        bomb.scale(2, 2);       
            bomb.frame = [0, 1, 2, 3, 4, null];                           
        });   
    });

    //==========
    // ここまで
    //==========
}

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();
}

コメントを残す

メールアドレスが公開されることはありません。