原生js面向對象實現飛機大戰小游戲(有BOSS,含源碼)


在線體驗:http://hymhub.gitee.io/plane-game
源碼:https://gitee.com/hymhub/plane-game
游戲音效用了FC魂斗羅的,可在電腦和安卓設備體驗(安卓推薦將鏈接在微信或QQ聊天發送后點擊打開),移動端子彈自動發射,添加了手指按住飛機拖動操作。PC端操作見下文。

游戲主要有幾個知識點:

第一個:判斷子彈與敵方飛機碰撞判斷,敵方飛機與我方飛機碰撞判斷,我方飛機與道具碰撞判斷,都是一樣的,實際都是判斷兩者是否有重合
首先我們舉例子彈與敵機碰撞:

這里畫了個圖,可以分析出x坐標碰撞的判斷條件,而y坐標也是一樣,如下:

此時就限定了子彈的x和y必須在敵機范圍內才會觸發,同理我方飛機與敵方飛機碰撞判斷條件是:
(我方飛機X坐標 + 我方飛機寬度 > 敵方飛機X坐標 && 我方飛機X坐標 < 敵方飛機X坐標 + 敵方飛機寬度) && (我方飛機Y坐標 <= 敵方飛機Y坐標 + 敵方飛機高度 && 我方飛機Y坐標 + 我方飛機高度 > 敵方飛機Y坐標)

第二個:游戲中Boss發子彈算法是利用boss移動的定時器使變量num自增,然后滿足以下公式就發射子彈,增加了可變性:
(num++ % (parseInt(Math.random() * 300) + 400) == 0)

第三個:Boss的子彈移動算法(Boss有兩種子彈,這里說的是圓形子彈,激光子彈是垂直降落,就不說了):
Boss的子彈移動規則是從發射子彈時Boss的位置向我的飛機位置勻速移動,這個需要做的就是讓一個點勻速往另一個點移動,但是他們的x,y相差的距離又不一樣,
假如把Boss的子彈需要移動的x和y總距離分別分成100份,就可以讓x每次移動需要移動的x總距離除以100,y也一樣,這樣就實現了,我這里分成了400份,代碼為:

// this.x、this.y代表Boss子彈的x、y坐標,this.myPlaneY代表目標點的y坐標,this.bossX代表boss發射子彈的起始x坐標
// 因為boss永遠是從上面往下發射子彈,所以可以直接寫成下面這樣
setInterval(() => {
      this.y += this.myPlaneY / 400;
      this.x += (this.myPlaneX - this.bossX) / 400;
      this.zidanNode.style.top = this.y + 'px';
      this.zidanNode.style.left = this.x + 'px';
}, 10);

第四個:Boss移動算法,見過windowXP系統的屏幕保護氣泡動畫的都知道,就是讓boss在一個矩形內x/y坐標都遞增,碰到邊界往反方向走,代碼如下:

this.tempX = 1;
this.tempY = 1;
setInterval(() => {
      this.x += 0.2 * this.tempX;
      this.y += 0.2 * this.tempY;
      // 矩形寬高:320 * 60(Boss的活動范圍)
      // 碰到左右邊界
      if (this.x <= 0 || this.x >= 320 - this.srcObj.w) { // this.srcObj.w:Boss自身寬度
          this.tempX = -this.tempX;
      }
      // 碰到上下邊界
      if (this.y <= 0 || this.y >= 60) {
          this.tempY = -this.tempY;
      }
}, 10);

這個案例還可以做很多其他有趣的東西,有興趣也可以看看我寫的小球游戲和運動留言板:https://www.cnblogs.com/hymenhan/p/14215793.html

游戲說明:
1、大飛機需5發子彈死亡,中飛機3發,小飛機1發
2、敵方飛機移動速度和敵方飛機生產速度會逐漸加快,峰值有上限
3、游戲中會隨機出現三連發道具和全屏炸彈道具,三連發有效期10秒,時間不疊加
4、每殺100個敵人會有可能觸發boss出現
5、控制鍵:WASD移動,回車或數字鍵0發射子彈,按住不放持續發射


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM