Какой самый эффективный способ проверить, сталкиваются ли два объекта и замедляются ли они при ударе? - PullRequest
1 голос
/ 01 декабря 2019

Хорошо, я работаю над простой игрой на платформе Javascript. Я хочу проверить, не столкнулся ли движущийся предмет с поверхностью, и затем замедлить объект, если это так.

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

Дайте мне знать, что вы думаете.

Это то, что я пытался, которыйработает успешно, но было бы ужасно, если в любой момент на экране много объектов.

const fps = 60;
const g = (9.81)*(1/fps);

...

function move(item) {
    item.x += Math.floor(item.vx);

    item.vy += g;
    item.y += Math.round(item.vy);

    for (let i=0; i<blocks.length; i++) {
        adjustBump(item, blocks[i]);
    }
}

function adjustBump (item, surface) {
    // Horizontal bumping
    if (item.x + item.w >= surface.x && item.vx > 0 && ((item.y >= surface.y && item.y + item.h <= surface.y + surface.h) || (item.y <= surface.y && item.y + item.h >= surface.y + surface.h))) {
        item.vx *= -g;
    } else if (item.x <= surface.x + surface.w && item.vx < 0 && ((item.y >= surface.y && item.y + item.h <= surface.y + surface.h) || (item.y <= surface.y && item.y + item.h >= surface.y + surface.h))) {
        item.vx *= -g;
    }
    // Vertical bumping
    if (item.y + item.h >= surface.y && item.vy > 0 && ((item.x >= surface.x && item.x + item.w <= surface.x + surface.w) || (item.x <= surface.x && item.x + item.w >= surface.x + surface.w))) {
        item.vy *= -g;
    } else if (item.y <= surface.y + surface.h && item.vy < 0 && ((item.x >= surface.x && item.x + item.w <= surface.x + surface.w) || (item.x <= surface.x && item.x + item.w >= surface.x + surface.w))) {
        item.vy *= -g;
    }
}

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

Заранее спасибо! Кельвин

1 Ответ

1 голос
/ 01 декабря 2019

В настоящее время я работаю над платформерной игрой на C #, поэтому думаю, что могу дать вам несколько советов.

Прежде всего, если вам нужен эффективный алгоритм обнаружения столкновений, я не рекомендуюидти за сложными алгоритмами, которые никто не понимает. Вместо этого я бы остановился на проверке всех сопоставимых объектов в цикле.

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

То, что я сделал, было функцией, которая проверяет все сущности на наличие коллизий, и если есть одна return true. В противном случае return false. Это означает, что вы не будете тратить время на проверку объектов, если знаете, что произошло столкновение.

Возвращенное логическое значение в основном означает, столкнулись ли вы или нет.

Итак, переместите движущийся элемент, затем проверьте, есть ли столкновения с помощью функции, и, если они есть, отрегулируйте положение и остановите движение.

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

...