1. 程式人生 > >[知了堂學習筆記]_純JS制作《飛機大戰》遊戲_第3講(邏輯方法的實現)

[知了堂學習筆記]_純JS制作《飛機大戰》遊戲_第3講(邏輯方法的實現)

了解 隱藏 div 開始遊戲 創建對象 eve 我們 span nbsp

整體展示:

技術分享

上一講實現了諸多對象,這次我們就需要實現許多邏輯方法,如控制飛機移動,判斷子彈擊中敵機,敵機與英雄飛機相撞等等。並且我們在實現這些功能的時候需要計時器去調用這些方法。setInterval(fun,ms)

在調用setInterval()會返回一個類似id的字段,該字段在clearInterval(id)可以指定相應的計時器並清除

一、開始遊戲

/**
 * 面板441*632
 * 飛機 66*80
 */
/**
 * 開始遊戲
 */
function startGame() {
    var welcome = document.getElementById("welcome");

    myPlane 
= new createPlane("img/own.png", 190, 550, 5, 5); welcome.style.visibility = "hidden"; //將進入歡迎界面隱藏 // ctrlMove(); /* * 啟動定時器 */ ctrlmove = setInterval(ctrlMove,20); ctrlshot = setInterval(ctrlShot,200); bulletfly = setInterval(bulletFly,20); createenemy = setInterval(enemy,200); enemymove
= setInterval(enemyMove,20); hitplane = setInterval(hitPlane,30); exist = setInterval(isexist,20); }

二、控制英雄飛機移動

/*
     * 鍵盤監聽,用於判斷英雄的動作 wasd移動方向,j射擊,k必殺
     * 放在開始遊戲方法中
     */
    document.body.onkeydown = function(code){
        if(code.keyCode == 65){
            leftbtn = true;
        }
        
if(code.keyCode == 68){ rightbtn = true; } if(code.keyCode == 87){ topbtn = true; } if(code.keyCode == 83){ bottombtn = true; } if(code.keyCode == 74){ shot = true; } if(code.keyCode == 75){ shotboom = true; } } document.body.onkeyup=function(code){ if(code.keyCode==65){ leftbtn=false; } if(code.keyCode == 68){ rightbtn = false; } if(code.keyCode == 87){ topbtn = false; } if(code.keyCode == 83){ bottombtn = false; } if(code.keyCode == 74){ shot = false; } if(code.keyCode == 75){ shotboom = false; } }

/**
 * 控制英雄移動的函數
 */
function ctrlMove(){
    if(leftbtn==true){
        myPlane.leftMove()
    }
    if(rightbtn==true){
        myPlane.rightMove()
    }
    if(topbtn==true){
        myPlane.topMove()
    }
    if(bottombtn==true){
        myPlane.botoomMove()
    }
    //獲取玩家參數
    getInfo();
}

三、子彈擊中對象

/**
 * 子彈擊中對象
 */
function hitPlane(){
    /*
     * 英雄子彈打中敵機
     */
    for(i=0;i<bulletList.length;i++){    //遍歷英雄子彈集合
        for(j=0;j<enemyList.length;j++){    //遍歷敵軍集合
            //獲取子彈坐標和敵軍坐標
            var btop = parseInt(bulletList[i].bulletNode.style.top);
            var bleft = parseInt(bulletList[i].bulletNode.style.left);
            var etop = parseInt(enemyList[j].enemyNode.style.top);
            var eleft = parseInt(enemyList[j].enemyNode.style.left);
            if(!enemyList[j].isdead){
                if(bleft>=eleft-5&&bleft<eleft+34&&btop>etop&&btop<etop+34){
                    bulletList[i].ishit=true;    //擊中把子彈狀態改為true
                    if(--enemyList[j].blood<=0)    //判斷敵軍是否死亡
                        enemyList[j].isdead=true;
                }
            }
        }
    }
    /*
     * boos子彈打中英雄
     */
    var top = parseInt(myPlane.planeNode.style.top);
    var left = parseInt(myPlane.planeNode.style.left);
    for(i=0;i<boosBullet.length;i++){
            var btop = parseInt(boosBullet[i].bulletNode.style.top);
            var bleft = parseInt(boosBullet[i].bulletNode.style.left);
            if(myPlane.blood>=0){
                if(btop+55>=top&&btop<top+80&&bleft>=left-22&&bleft<left+40){
                    boosBullet[i].ishit=true;
                    myPlane.blood--;
                }
            }
    }
    
    /**
     *子彈打中BOOS 
     */
    for(i=0;i<bulletList.length;i++){
        var btop = parseInt(bulletList[i].bulletNode.style.top);
        var bleft = parseInt(bulletList[i].bulletNode.style.left);
        for(j=0;j<boosList.length;j++){
            var top=parseInt(boosList[j].enemyNode.style.top);
            var left=parseInt(boosList[j].enemyNode.style.left);
            if(!boosList[j].isdead){
                if(bleft-5>=left&&bleft<left+90&&btop>=top&&btop<top+80){
                    console.log(boosList[j].blood)
                    bulletList[i].ishit=true;
                    if(--boosList[j].blood<=0)
                        boosList[j].isdead=true;
                }
            }
        }
    }
}

四、對象間碰撞

/**
 * 對象相撞
 */
function strike(){
    var mleft = parseInt(myPlane.planeNode.style.left);
    var mtop = parseInt(myPlane.planeNode.style.top);
    if(myPlane.blood>0){
        for(i=0;i<enemyList.length;i++){    //遍歷敵機
            if(!enemyList[i].isdead){    //敵機是否死亡
                var eleft = parseInt(enemyList[i].enemyNode.style.left);
                var etop = parseInt(enemyList[i].enemyNode.style.top);
                if(eleft>=mleft&&eleft<mleft+68&&etop>=mtop&&etop<mtop+80){    //碰撞判斷
                    enemyList[i].isdead = true;    //敵機一碰撞到英雄飛機立即死亡
                    enemyList[i].enemyNode.src ="img/enemybz.png";    //切換圖片,制作爆炸特效
                    myPlane.blood--;    //英雄血量減少
                }
            }
        }
    }
    /*
     * 得到道具
     */
    if(myPlane.blood>0){    //判斷英雄是否死亡
        for(i=0;i<toolList.length;i++){    //遍歷道具數組
            if(!toolList[i].getme){
                var tleft = parseInt(toolList[i].toolNode.style.left);
                var ttop = parseInt(toolList[i].toolNode.style.top);
                if(tleft>=mleft-15&&tleft<mleft+65&&ttop>=mtop&&ttop<mtop+80){
                    toolList[i].getme=true;
                    if(toolList[i].tooltype%2==1){    //tooltype單數為加必殺,雙數為加血
                        if(myPlane.boom<5)
                            myPlane.boom++;
                    }else{
                        myPlane.blood++;
                    }
                }
            }
        }
    }
}

五、判斷對象是否死亡

/*
 * 判斷對象是否存在
 */
function isexist(){
    /*
     * 判斷敵機是否死亡
     */
    for(i=0;i<enemyList.length;i++){
        if(enemyList[i].isdead){    //敵機死亡
            enemyList[i].enemyNode.src ="img/enemybz.png";    //將圖片換成爆炸圖片
            if(enemyList[i].deadtime>=0){    //移除時間,也就是飛機死亡到移除的時間,實現爆炸的特效
                enemyList[i].deadtime--;
            }else{
                score+=myPlane.level;
                killNum++;
                mainobj.removeChild(enemyList[i].enemyNode);    //先移除節點
                enemyList.splice(i,1);                            //再取消綁定
            }
        }
    }
    /*
     * 判斷英雄是否死亡
     */
    if(myPlane.blood<=0){
        mainobj.removeChild(myPlane.planeNode);
        gameOver();
    }
    /*
     * 判斷boos是否死亡
     */
    for(i=0;i<boosList.length;i++){
        if(boosList[i].isdead){
            if(boosList[i].deadtime<=0){
                mainobj.removeChild(boosList[i].enemyNode)
                boosList.splice(i,1);
                score+=100*myPlane.level;
                pass++;
                nextGame();
            }else{
                boosList[i].deadtime--;
                boosList[i].enemyNode.src="img/dfjbz.png";
            }
        }
    }
    /*
     * 判斷道具是否存在
     */
    
    for(i=0;i<toolList.length;i++){
        if(toolList[i].getme){
            mainobj.removeChild(toolList[i].toolNode);
            toolList.splice(i,1);
        }
    }
}

===============================================================================================================================

第二講補充:

我在創建對象時候(除英雄飛機對象),都將其放進Arrar中,這是為了綁定該對象,為了方面找到這個對象。方便操作。

以上為今天的內容,如需了解更加深入的知識,請大家進入知了堂社區:http://www.zhiliaotang.com/portal.php;

[知了堂學習筆記]_純JS制作《飛機大戰》遊戲_第3講(邏輯方法的實現)