微信打飛機

微信打飛機.gif

對象:主機囊骤、子彈晃择、敵機
動畫:畫、動
碰撞:主機碰撞敵機也物、子彈碰撞敵機(像素碰撞--性能問題)
玩法宫屠、聲音:(選做)

普通碰撞

圖片預(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;
            
    //主機對象構(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++;
        //主機爆炸
        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;
        }
    }
            
    //子彈對象構(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++){
            //子彈與敵機碰撞
            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;
        }
    }
    
    //敵機對象構(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;
        //敵機與主機碰撞
        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;
        }
    }
    //主機實例化
    var x = 120;
    var y = canvas.height-loadArr.herofly.height;
    newHero = new Hero(x,y,100,loadArr.herofly);
    console.log(newHero);
    newHero.draw();
    //鍵盤控制上下左右
    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 = "";
    }
    //子彈實例化
    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++;
        //清空畫布
        context.clearRect(0,0,canvas.width,canvas.height);
        //背景
        drawBg();
        //主機
        newHero.draw();
        newHero.move();
        //敵機
        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(){
        //畫背景
        bgY++;
        if(bgY>canvas.height){
            bgY=0;
        }
        context.drawImage(loadArr.bg,0,bgY);
        context.drawImage(loadArr.bg,0,bgY-canvas.height);
    }
}

隨機函數(shù)

function randNum(min,max){
    return parseInt(Math.random()*(max-min)+min);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滑蚯,隨后出現(xiàn)的幾起案子浪蹂,更是在濱河造成了極大的恐慌,老刑警劉巖告材,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坤次,死亡現(xiàn)場離奇詭異,居然都是意外死亡斥赋,警方通過查閱死者的電腦和手機缰猴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灿渴,“玉大人洛波,你說我怎么就攤上這事∩叮” “怎么了蹬挤?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棘幸。 經(jīng)常有香客問我焰扳,道長,這世上最難降的妖魔是什么误续? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任吨悍,我火速辦了婚禮,結(jié)果婚禮上蹋嵌,老公的妹妹穿的比我還像新娘育瓜。我一直安慰自己,他們只是感情好栽烂,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布躏仇。 她就那樣靜靜地躺著,像睡著了一般腺办。 火紅的嫁衣襯著肌膚如雪焰手。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天怀喉,我揣著相機與錄音书妻,去河邊找鬼。 笑死躬拢,一個胖子當(dāng)著我的面吹牛躲履,可吹牛的內(nèi)容都是我干的见间。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼崇呵,長吁一口氣:“原來是場噩夢啊……” “哼缤剧!你這毒婦竟也來了馅袁?” 一聲冷哼從身側(cè)響起域慷,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汗销,沒想到半個月后犹褒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弛针,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年叠骑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片削茁。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡宙枷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茧跋,到底是詐尸還是另有隱情慰丛,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布瘾杭,位于F島的核電站诅病,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粥烁。R本人自食惡果不足惜贤笆,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讨阻。 院中可真熱鬧芥永,春花似錦、人聲如沸钝吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搀绣。三九已至飞袋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間链患,已是汗流浹背巧鸭。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麻捻,地道東北人纲仍。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓呀袱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親郑叠。 傳聞我的和親對象是個殘疾皇子夜赵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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