Возникли проблемы с созданием игрового движка для двумерной физики (JavaScript) - PullRequest
1 голос
/ 08 февраля 2020

Надеюсь, у тебя все хорошо. Я начинающий программист, и недавно я работал над движком 2d физики в JavaScript. Казалось, что все работает нормально, пока я не наткнулся на досадную ошибку в моем pu sh mechani c.

. Я создал систему pu sh со встречным квадратом (игроком), который может pu sh одновременно несколько других встречных квадратов и останавливаются, когда квадраты ударяются о стену (чего нельзя сделать pu sh). Однако, когда игрок толкает один или несколько квадратов одновременно, все они летят к вершине стены, за исключением квадрата, который находится ближе всего к стене (как видно на видео).

Файлы проекта

Видео, в котором показана проблема

Я уже некоторое время пытаюсь решить эту проблему и просто не могу найти идеальное решение.

Если кто-нибудь сможет помочь, было бы здорово. Спасибо

collisionDetection: function(game) {
    var collisionDetection = function(obj01, obj02) {
        if(obj01.x < obj02.x + obj02.colW &&
            obj01.x + obj01.colW > obj02.x &&
            obj01.y < obj02.y + obj02.colH &&
            obj01.y +obj01.colH > obj02.y) {
                physics.handleCollision(obj01, obj02);
        }
    };     

    for (let i = 0; i < game.gameComponents.length; i++) {

        for (let j = i + 1; j < game.gameComponents.length; j++) {
            const obj01 = game.gameComponents[i];
            const obj02 = game.gameComponents[j];
            collisionDetection(obj01, obj02);
        }
    }
},

    handleCollision: function(obj01, obj02) {

    var tr = obj01.x + obj01.colW // This right side
    var tl = obj01.x // This left
    var tt = obj01.y // This top

    var or = obj02.x + obj02.colW // Other right
    var ol = obj02.x // Other left
    var ot = obj02.y // Other top

    // North, east, south, west of other (around)
    if (obj02.colType == "nesw") {

        // Top of other
        if(obj01.y+obj01.colH>obj02.y && tl + obj01.colW > obj02.x+3 && tl < obj02.x+obj02.colW-3) {
            obj01.y = obj02.y - obj01.colH;
        }
        // Bottom of other
        if(tr > ol + 3 && tl < or - 3 && tt > ot) {
            obj01.y = obj02.y + obj02.colH;
        }
        // Left of other
        if(tl < obj02.x && obj01.y + obj01.colH > obj02.y && obj01.y < obj02.y + obj02.colH) {
            if (obj02.pushable == true ) {

                obj02.x = (obj01.x + obj01.colW) 

            }else {
                obj01.x = (obj02.x - obj01.colW) 
            }


        }
        // right of other
        if(tl > obj02.x && obj01.y + obj01.colH > obj02.y && obj01.y < obj02.y + obj02.colH) {
            obj01.x = obj02.x + obj02.colW;
        }

    }
...