检查两个物体是否发生碰撞和减速的最有效方法是什么?
What is most efficient way to check if two objects are colliding and decellerate on impact?
好的,我正在开发一款简单的 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# 控制台平台游戏,所以我想我可以给你一些提示。
首先,如果你想要一个高效的碰撞检测算法,我不建议你去追求那些没人能理解的复杂算法。相反,我会坚持检查循环中的所有可碰撞对象。
如果这对您来说是一个真正的性能问题,您可以使用可碰撞对象的树结构(可能按位置排序)而不是数组;这意味着您将首先检查最近的(因此最有可能与之发生碰撞的)物体。
我所做的是一个检查所有实体是否发生碰撞以及是否存在碰撞的函数 return true
。否则return false
。这意味着如果您知道会发生碰撞,就不会浪费时间检查对象。
返回的布尔值基本上表示是否发生碰撞。
所以移动移动中的物品,然后使用函数检查是否有碰撞,如果有,调整位置并停止移动。
我不知道这些技术是否适合你,因为在我的游戏中坐标主要是整数(除了跳跃时,我在那里做了一些浮动舍入技巧),但我认为整体概念可能相似。
好的,我正在开发一款简单的 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# 控制台平台游戏,所以我想我可以给你一些提示。
首先,如果你想要一个高效的碰撞检测算法,我不建议你去追求那些没人能理解的复杂算法。相反,我会坚持检查循环中的所有可碰撞对象。
如果这对您来说是一个真正的性能问题,您可以使用可碰撞对象的树结构(可能按位置排序)而不是数组;这意味着您将首先检查最近的(因此最有可能与之发生碰撞的)物体。
我所做的是一个检查所有实体是否发生碰撞以及是否存在碰撞的函数 return true
。否则return false
。这意味着如果您知道会发生碰撞,就不会浪费时间检查对象。
返回的布尔值基本上表示是否发生碰撞。
所以移动移动中的物品,然后使用函数检查是否有碰撞,如果有,调整位置并停止移动。
我不知道这些技术是否适合你,因为在我的游戏中坐标主要是整数(除了跳跃时,我在那里做了一些浮动舍入技巧),但我认为整体概念可能相似。