微信打飛機(jī)

微信打飛機(jī).gif

對(duì)象:主機(jī)、子彈、敵機(jī)
動(dòng)畫(huà):畫(huà)、動(dòng)
碰撞:主機(jī)碰撞敵機(jī)、子彈碰撞敵機(jī)(像素碰撞--性能問(wèn)題)
玩法、聲音:(選做)

普通碰撞

圖片預(yù)加載

var imgArr = {
            "bg":"img/background.png",
            "herofly":"img/herofly.png",
            "bullet1":"img/bullet1.png",
            "bullet2":"img/bullet2.png",
            "enemy1":"img/enemy1.png",
            "enemy2":"img/enemy2.png",
            "enemy3":"img/enemy3.png",
            "prop":"img/prop.png"
        };
        var imgLength = 0;
        for(var i in imgArr){
            imgLength++;
        }
        var loadArr = {};
        var num = 0;    
        for(let i in imgArr){
            var img = new Image();
            img.src = imgArr[i];
            img.onload = function(){
                loadArr[i] = this;
                num++;
                if(num>=imgLength){
                    main(loadArr);
                }
            }
        }
function main(loadArr){
    var canvas = document.getElementById("mycanvas");
    var context = canvas.getContext("2d");
    canvas.width = loadArr.bg.width;
    canvas.height = loadArr.bg.height;     
            
    var alive = document.querySelector("#progress div");
    var aliveStyle =alive.currentStyle ? alive.currentStyle : window.getComputedStyle(alive,null);
    var scoreObj = document.querySelector("#score span");
    var score = 0;
            
    //主機(jī)對(duì)象構(gòu)造函數(shù)
    function Hero(x,y,blood,obj){
        this.x = x;
        this.y = y;
        this.blood = blood;
        this.obj = obj;
        this.w = loadArr.herofly.width/5;
        this.h = loadArr.herofly.height;
        this.index = 0;
        this.num = 0;
        this.dis = "";
    }
    Hero.prototype.draw = function(){
        this.num++;
        //主機(jī)爆炸
        if(this.blood<=0){
            if(this.num%10 == 0){
                this.index++;
            }
        }
        context.drawImage(this.obj,(loadArr.herofly.width/5)*this.index,0,this.w,this.h,this.x,this.y,this.w,this.h);
    }
            
    Hero.prototype.move = function(){
        switch(this.dis){
            case "right":
                this.x+=3;
                if(this.x>=canvas.width-this.w){
                    this.x = canvas.width-this.w;
                }
                break;
            case "left":
                this.x-=3;
                if(this.x<=0){
                    this.x=0;
                }
                break;
            case "up":
                this.y-=3;
                if(this.y<=0){
                    this.y = 0;
                }
                break;
            case "down":
                this.y+=3;
                if(this.y>=canvas.height - this.h){
                    this.y = canvas.height-this.h;
                }
                break;
            default:
                break;
        }
    }
            
    //子彈對(duì)象構(gòu)造函數(shù)
    function Bullet(x,y,power,obj,speed){
        this.x = x;
        this.y = y;
        this.power = power;
        this.obj = obj;
        this.w = obj.width;
        this.h = obj.height;
        this.speed = speed;
    }
    Bullet.prototype.draw = function(){
        context.drawImage(this.obj,0,0,this.w,this.h,this.x,this.y,this.w,this.h)
    }
    Bullet.prototype.move = function(){
        this.y -= this.speed;
        for(var j=0;j<enemy.length;j++){
            //子彈與敵機(jī)碰撞
            if(this.x<enemy[j].x+enemy[j].w&&this.x+this.w>enemy[j].x&&this.y<enemy[j].y+enemy[j].h&&this.y+this.h>enemy[j].y){
                var auEnemy = new Audio();
                auEnemy.autoplay = "autoplay";
                if(enemy[j].count==5){
                    enemy[j].blood-=30;
                    auEnemy.src = "audio/enemy1_down.mp3";
                }else if(enemy[j].count == 6){
                    enemy[j].blood -=25;
                    auEnemy.src = "audio/enemy2_down.mp3";
                }else if(enemy[j].count == 10){
                    enemy[j].blood -= 10;
                    auEnemy.src = "audio/enemy3_down.mp3";
                }  
                document.getElementsByTagName("body")[0].appendChild(auEnemy);
                setTimeout(function(){
                    auEnemy.remove();
                },1000)
                if(enemy[j].count>3){
                    this.y = -this.h;
                }
                if(enemy[j].index>=enemy[j].count-2&&enemy[j].count>3){
                    if(enemy[j].count == 5){
                        score += 10;
                    }else if(enemy[j].count == 6){
                        score += 20;
                    }else if(enemy[j].count == 10){
                        score += 30;
                    }
                    enemy[j].y = canvas.height;
//                  console.log(scoreObj.innerHTML);
                }
                
            }
        } 
    }
    //清除子彈
    Bullet.prototype.isClear = function(){
        if(this.y<=-this.h){
            return true;
        }else{
            return false;
        }
    }
    
    //敵機(jī)對(duì)象構(gòu)造函數(shù)
    function Enemy(obj,x,y,w,h,speed){
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.obj = obj;
        this.speed = speed;
        this.blood = 100;
        this.index = 0;
        this.num = 0;
        this.count = 0;
    }
    Enemy.prototype.draw = function(){
        this.num++;
        if(this.blood<=50&&this.count>3){
            if(this.num%3==0){
                this.index++;
            }
        }
        context.drawImage(this.obj,this.index*this.w,0,this.w,this.h,this.x,this.y,this.w,this.h);
    }
    Enemy.prototype.move = function(){
        this.y += this.speed;
        //敵機(jī)與主機(jī)碰撞
        if(this.x<newHero.x+newHero.w&&this.x+this.w>newHero.x&&this.y<newHero.y+newHero.h&&this.y+this.h>newHero.y){
            if(isHero){
                if(_this.count>3){
                    newHero.blood -= 20;
                    alive.style.width = parseInt(aliveStyle.width) - 30 +"px";
                    isHero = false;
                }else{
                    if(_this.count == 0){
                        bulletObj = loadArr.bullet1;
                        for(var k=0;k<enemy.length;k++){
                            enemy[k].y = canvas.height;
                            if(enemy[k].count == 1){
                                bulletObj = loadArr.bullet2;
                            }else if(enemy[k].count == 2){
                                if(newHero.blood < 100){
                                    newHero.blood +=20;
                                    alive.style.width = parseInt(aliveStyle.width) + 30 +"px";
                                }
                            }else if(enemy[k].count == 5){
                                score += 10;
                            }else if(enemy[k].count == 6){
                                score += 20; 
                            }else if(enemy[k].count == 10){
                                    score += 30;
                            }
                        }
                    }else if(_this.count == 1){
                        bulletObj = loadArr.bullet2;
                    }else if(_this.count == 2){
                        if(newHero.blood < 100){
                            newHero.blood +=20;
                            alive.style.width = parseInt(aliveStyle.width) + 30 +"px";
                        }
                    }
                }
            }
            _this.y = canvas.height;
        }
    }
    Enemy.prototype.isClear = function(){
        if(this.y>=canvas.height){
            return true;
        }else{
            return false;
        }
    }
    //主機(jī)實(shí)例化
    var x = 120;
    var y = canvas.height-loadArr.herofly.height;
    newHero = new Hero(x,y,100,loadArr.herofly);
    console.log(newHero);
    newHero.draw();
    //鍵盤(pán)控制上下左右
    document.onkeydown = function(e){
        var ev = window.event || e;
        switch(ev.keyCode){
            case 37:
                newHero.dis = "left";
                break;
            case 38:
                newHero.dis = "up";
                break;
            case 39:
                newHero.dis = "right";
                break;
            case 40:
                newHero.dis = "down";
                break;
            default:
                newHero.dis="";
                break;
        }
    }
    document.onkeyup = function(){
        newHero.dis = "";
    }
    //子彈實(shí)例化
    bulletObj = loadArr.bullet1;
    var newBullet = new Bullet(newHero.x+(newHero.w/2)-bulletObj.width/2,y-10,2,loadArr.bullet1,2);
    newBullet.draw();
    //存放子彈的容器
    bullet = [];
    enemy = [];
    var count = 0;
    var bgY = 0;    
    isHero = true;
    function act(){
        count++;
        //清空畫(huà)布
        context.clearRect(0,0,canvas.width,canvas.height);
        //背景
        drawBg();
        //主機(jī)
        newHero.draw();
        newHero.move();
        //敵機(jī)
        if(count%60==0){
            var rand = randNum(0,11);
//          console.log(rand);
            if(rand<=5){
                var enemyW = loadArr.enemy1.width/5;
                var enemyX =  randNum(0,canvas.width-enemyW+1);
                var newEnemy = new Enemy(loadArr.enemy1,enemyX,-loadArr.enemy1.height,enemyW,loadArr.enemy1.height,3);
                newEnemy.count = 5;
            }else if(rand>5 && rand<8){
                var enemyW = loadArr.enemy2.width/6;
                var enemyX =  randNum(0,canvas.width-enemyW+1);
                var newEnemy = new Enemy(loadArr.enemy2,enemyX,-loadArr.enemy2.height,enemyW,loadArr.enemy2.height,2);
                newEnemy.count = 6;
            }else if(rand==8){
                var enemyW = loadArr.enemy3.width/10;
                var enemyX = randNum(0,canvas.width-enemyW+1);
                var newEnemy = new Enemy(loadArr.enemy3,enemyX,-loadArr.enemy3.height,enemyW,loadArr.enemy3.height,1);
                newEnemy.count = 10;
            }else{
                var rands = randNum(0,3);
                var enemyW = loadArr.prop.width/3;
                var enemyX = randNum(0,canvas.width-enemyW+1);
                var newEnemy = new Enemy(loadArr.prop,enemyX,-loadArr.prop.height,enemyW,loadArr.prop.height,2);
                newEnemy.count = rands;
                newEnemy.index = rands;
            }
            enemy.push(newEnemy);
        }
        for(var i=0;i<enemy.length;i++){
            enemy[i].draw();
            enemy[i].move();
            if(enemy[i].isClear()){
                //判斷是否出界清除
                enemy.splice(i,1);
                isHero = true;
            }
        }
        //子彈
        if(count%20==0){
            var newBullet = new Bullet(newHero.x+(newHero.w/2)-bulletObj.width/2,newHero.y-10,2,bulletObj,2);
            bullet.push(newBullet);
            var audios = new Audio();
            audios.src = "audio/bullet.mp3";
            audios.autoplay = "autoplay";
            document.getElementsByTagName("body")[0].appendChild(audios);
            setTimeout(function(){
                audios.remove();
            },100)
        }
        for(var i=0;i<bullet.length;i++){
            bullet[i].draw();
            bullet[i].move();
            if(bullet[i].isClear()){
                bullet.splice(i,1);
            }
        }
        scoreObj.innerHTML = score;
        var res = window.requestAnimationFrame(act);
        if(newHero.index>=4){
            cancelAnimationFrame(res);
            document.getElementById("mask").style.display = "block";
            document.querySelector("#mask audio").autoplay = "autoplay";
            document.querySelector("#gameStart").autoplay = "";
            document.querySelector("#endScore span").innerHTML = score;
        }
    }
    act();

    function drawBg(){
        //畫(huà)背景
        bgY++;
        if(bgY>canvas.height){
            bgY=0;
        }
        context.drawImage(loadArr.bg,0,bgY);
        context.drawImage(loadArr.bg,0,bgY-canvas.height);
    }
}

隨機(jī)函數(shù)

function randNum(min,max){
    return parseInt(Math.random()*(max-min)+min);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,560評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,035評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,814評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,224評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,444評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,804評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,998評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,237評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,665評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,927評(píng)論 1 287
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,706評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,993評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容