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