亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Javascript 游戲命中檢測僅適用于第一個對象

Javascript 游戲命中檢測僅適用于第一個對象

鴻蒙傳說 2022-11-03 10:56:42
我已經潛伏了很長時間,但只是在這里注冊。該站點對涉及 VBA、PHP、MySQL 和 CSS 的工作和個人項目提供了極大的幫助。我正處于學習 Javascript 的早期階段,我通過處理實際項目學得最好,所以我正在開發一款名為 Coronaga 的冠狀病毒主題的 Galaga 風格游戲。我跟著 w3schools 上的 HTML/JS 游戲教程學習,所以一般框架就像他們的示例游戲一樣開始。我希望能夠使用對象數組來制作實際冗長且具有挑戰性的游戲玩法,而無需大量重復代碼,但這是另一場戰斗。我有五個“壞人”顯示并朝主角向下移動,但盡管對命中檢測代碼進行了很多擺弄,但我只能讓它在最左邊的“壞人”上工作。我以前讓它在其他“壞人”上工作,但你必須先打左邊,所以沒用。我正在為對象使用 SVG 圖像,因此 CodePen 并不是一個真正有效的演示,但它可以在以下鏈接中使用:http ://hwmp.hopto.org:100/coronaga/coronaga.html我還將所有代碼和資源都放在了 GitHub 上: https ://github.com/jonbuder/coronaga這是游戲區域更新,包括命中檢測代碼:function updateGameArea() {        myGameArea.clear();    //myScore.text = "SCORE: ";    //myScore.update();        ctx = myGameArea.context;    ctx.font = '20px Consolas';    ctx.fillStyle = '#FFFFFF';    ctx.fillText(("Coronavirus: " + score +"   Humanity: " + peoplePoint), 80, 20);        myGamePiece.speedX = 0;    myGamePiece.speedY = 0;        if (myGameArea.key && myGameArea.key == 37) {myGamePiece.speedX = -4; }    if (myGameArea.key && myGameArea.key == 39) {myGamePiece.speedX = 4; }    if (myGameArea.key && myGameArea.key == 38) {myGamePiece.speedY = -4; }    if (myGameArea.key && myGameArea.key == 40) {myGamePiece.speedY = 4; }    myGamePiece.newPos();        myGamePiece.update();    myBaddie1.newPos();    myBaddie1.update();    myBaddie2.newPos();    myBaddie2.update();    myBaddie3.newPos();    myBaddie3.update();    myBaddie4.newPos();    myBaddie4.update();    myBaddie5.newPos();    myBaddie5.update();    //myVirus.newPos();   if (myGameArea.key && myGameArea.key == 32) {myVirus.launch(); }    myVirus.reloadVirus();    myVirus.newPos();    myVirus.update();        }
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

OK 所以如果你不介意的話,我會盡量籠統的回答這個問題,制作這個游戲的具體代碼可以試著去適應。


基本上,假設您想要進行邊界框碰撞(框到框),您需要檢查每個的 x 和 y,以及每個的寬度和高度。


意思是,假設我有兩個對象,每個對象都有 x、y、width 和 height 屬性,x 和 y 在左上角,然后檢查它們是否發生碰撞,創建一個函數:


function areBoxesColliding(box1, box2) {

    return (

        box1.x < box2.x + box2.width &&

        box1.x + box1.width > box2.x &&

        box1.y < box2.y + box2.height &&

        box1.y + box1.height > box2.y

    )

}

現在,當您想檢查兩個對象是否正在命中(無論是子彈還是角色本身)時,首先要確保每個對象都具有與其實際位置相匹配的 x、y、寬度和高度屬性和大小,然后在循環中(或無論何時檢查),只需檢查


if(areBoxesColliding(someObjectLikePlayerOrBullet, someObjectLikeAnEnemy)) doIt();

只需將此基本方法適應您當前的代碼,我不知道myVirus.crashWith您的代碼是什么樣的,但只要確保它基本上是這樣的,以及檢查您的子彈是否擊中敵人的代碼。


順便說一句,您再次提到將您的角色放入數組中,但這真的很簡單,只需為每個敵人創建一個類構造函數,在渲染時循環遍歷該列表,并在檢查碰撞時循環遍歷它,當您想添加一個新敵人,只需調用.push數組


查看完整回答
反對 回復 2022-11-03
  • 1 回答
  • 0 關注
  • 277 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號