簡體   English   中英

沖突檢測的問題是JavaScript

[英]Issues with collision detection is JavaScript

基本上,我想做的是在不使用圖塊的情況下創建一個小的平台游戲,因此我必須手動做很多事情。 我做得很好,減去了過去導致我遇到問題的碰撞檢測。 當前的問題是某些平台對象(您將看到)拒絕正常工作,而其他平台對象則沒有問題。

我之前大部分工作都是在此工作,而只是在我增加了摩擦力和重力之后,它才開始占用大量時間。

handle_all_collisions: function(player) {
    if (player.position.x < 0) {
        player.position.x = 0;
    } else if (player.position.x + player.bounds.x > canvas.width) {
        player.position.x = canvas.width - player.bounds.x;
    }

    if (player.position.y < 0) {
        player.position.y = 0;
    } else if (player.position.y + player.bounds.y > canvas.height) {
        global.world.ground = true;
        player.position.y = canvas.height - player.bounds.y;
    } else {
        for (var i = 0; i < positions.length; i++) {
            if (collisions.is_colliding(player, obstacles[i])) {
                global.world.ground = true;
            } else {
                global.world.ground = false;
            }
        }
    }

    for (var i = 0; i < positions.length; i++) {
        if (collisions.is_colliding(player, obstacles[i])) {
            collisions.resolve_collision(player, obstacles[i]);
        } else {
            player.collided.up = false;
            player.collided.down = false;
            player.collided.left = false;
            player.collided.right = false;
        }
    }
}

這樣可以處理所有沖突,以便以后可以使用某些信息。 您會注意到我那里有一個global.world.ground = true/false ,用於更改玩家的y位置。 如果在某些時候未將其設置為true以允許跳躍,這將不是問題。 我一直在我的repl.it上這樣做,它將更好地展示它。 另一個問題是,當您離開左側平台(麻煩制造者)時,您最終消失在地板上,我認為這是由錯誤的檢測引起的。

我的最終目標是將碰撞檢測固定在接近完美的水平,因為它無需預測接下來幾幀中的位置就可以得到。 我真的不想更改我的對象創建技術,因為我希望使它盡可能短。 感謝您抽出寶貴的時間閱讀此內容。

您最大的問題是這種情況:

for (var i = 0; i < positions.length; i++) {
    if (collisions.is_colliding(player, obstacles[i])) {
        global.world.ground = true;
    } else {
        global.world.ground = false;
    }
}

這基本上只是測試玩家是否正在與最后一個障礙物發生碰撞,因為global.world.ground在每次迭代中都會被覆蓋。 您應該移動global.world.ground = false; 功能頂部,因為您想測試玩家是否正在與任何障礙物發生碰撞。

您的平台的行為有所不同,因為游戲僅將正確的平台(您最后添加的平台)識別為可站立的平台。 如果您跳到左側平台上,則稍后會在handle_all_collisions函數中使用resolve_collision函數將其handle_all_collisions

您錯過的第二件事是當玩家與某物體碰撞時重置其速度。 在功能resolve_collision ,只要在x軸上發生碰撞,就應該將player.velocity.x = 0設置player.velocity.x = 0如果在y軸上發生碰撞, player.velocity.y = 0 因此,當您站在左側平台上時,確實會被向上推出,但速度並沒有復位,因此在后台,玩家會累積所有重力加速度,並在一段時間后因為碰撞檢測而掉落通過平台無法應付這些速度。

當您站在地面障礙物(不是最后的障礙物)上時,幾乎是同一回事。 它也沒有被認為是地面,但是由於玩家速度的提高,他們很快就被注冊為站在畫布的真實底部。 這就是為什么您降落在地面障礙物上后不能跳一兩秒的原因。

我在您的副本的此副本中修復了這些問題: https : //repl.it/repls/AfraidNaiveQuote

仍然還有一些問題,但是我已經沒時間了,我想您也許可以自己解決這些問題。 例如,當玩家與左邊的某個東西碰撞時,它被解釋為處於地面。 因此它們可能會卡在牆上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM