javascript - 检查两个物体是否发生碰撞和减速的最有效方法是什么?

标签 javascript javascript-objects collision-detection collision intersection

好的,我正在开发一款简单的 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;
    }
}

如果对您有帮助,我很乐意分享更多我的代码。

提前致谢! 开尔文

最佳答案

我目前正在开发一款 C# 控制台平台游戏,所以我想我可以给你一些提示。

首先,如果你想要一个高效的碰撞检测算法,我不建议你去使用那些没有人理解的复杂算法。相反,我会坚持检查循环中的所有可碰撞对象。

如果这对您来说成为一个真正的性能问题,您可以使用可碰撞对象的树结构(可能按位置排序)而不是数组;这意味着您将首先检查最近(因此最有可能与之发生碰撞)的物体。

我所做的是一个函数,它检查所有实体是否存在碰撞,如果存在碰撞,则返回 true。否则返回false。这意味着如果您知道会发生碰撞,就不会浪费时间检查对象。

返回的 bool 值基本上表示您是否发生碰撞。

所以移动移动中的元素,然后使用函数检查是否有碰撞,如果有则调整位置并停止移动。

我不知道这些技术是否适合你,因为在我的游戏中坐标主要是整数(除了跳跃时,我在那里做了一些 float 舍入技巧),但我认为整体概念可能是相似的.

关于javascript - 检查两个物体是否发生碰撞和减速的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59129516/

相关文章:

javascript - 调整 Canvas 大小以适应容器

javascript - 如何上传 xml 文件并发送到 php 服务器

javascript - 从外部将值传递给 Angular 应用程序

javascript - 如何将同一属性上的数组和对象 "merge/concat"转换为平面数组(使用 Javascript)?

c++ - 轴对齐边界框碰撞 : what sides are colliding

c# - 使用此设置防止隧道?

javascript - 如何强制 Internet Explorer 应用 CSS 样式

javascript - Node.js 表达静态图像服务

javascript - 访问流对象时使用空括号?

collision-detection - 计算轴对齐边界框的大小