Я не могу заставить мои коллизии JavaScript работать. Как вы должны проверить их? - PullRequest
0 голосов
/ 28 июня 2019

Я работал над маленькой физической игрой в JS, где вы используете блок для перемещения других блоков, и они сталкиваются. Мои столкновения иногда перестают работать, и я не знаю почему. Я также не уверен, что проверяю их правильно.

this.checkCollision = function(otherobj) {
    var myleft = this.x;
    var myright = this.x + (this.width);
    var mytop = this.y;
    var mybottom = this.y + (this.height);
    var otherleft = otherobj.x;
    var otherright = otherobj.x + (otherobj.width);
    var othertop = otherobj.y;
    var otherbottom = otherobj.y + (otherobj.height);
    var crash = true;
    if ((mybottom < othertop) ||
        (mytop > otherbottom) ||
        (myright < otherleft) ||
        (myleft > otherright)) {
        crash = false;
    }
    if (crash) {
        this.colliding = true;
        $('body').css('background-color', 'red');
        this.collide(otherobj);
        // this.x++;
    } else {
        $('body').css('background-color', 'white');
        this.colliding = false;
    }
    return crash;
}
this.collide = function(otherobj) {
    //for when they stick
    if (this.speedX < 0.1 && this.speedY < 0.1) {
        this.x -= 2;
        otherobj.x += 2;
    }
    //get speed of x
    otherobj.speedX = this.speedX;
    this.speedX = -((this.mass * this.speedX) + (otherobj.mass * otherobj.speedX)) / (this.mass + otherobj.mass);
    // get speed of y
    otherobj.speedY = this.speedY;
    this.speedY = -((this.mass * this.speedY) + (otherobj.mass * otherobj.speedY)) / (this.mass + otherobj.mass);
}

Скрипка здесь

1 Ответ

0 голосов
/ 28 июня 2019

Ваш код обнаружения столкновения, кажется, работает в приведенном примере, если вы установите blueGamePiece.speedX = -5. Если ваша цель состоит в том, чтобы заставить два тела обмениваться скоростями при столкновении, вам поможет следующее:

this.collide = function (otherobj) {
    // swap X speeds
    temp = otherobj.speedX;
    otherobj.speedX = this.speedX;
    this.speedX = temp;
    // swap Y speeds
    temp = otherobj.speedY;
    otherobj.speedY = this.speedY;
    this.speedY = temp;
}

Это просто меняет скорости без отрицания (обратите внимание на временные переменные temp), что приводит к тому, что столкновения работают нормально, и объекты перемещаются в противоположных направлениях. Если вы хотите использовать правильный импульс, вы можете попытаться настроить код для использования соответствующих формул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...