检查两个物体是否在碰撞时碰撞并减速的最有效方法是什么?

问题描述 投票:0回答:1

[好,所以我正在研究一个简单的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;
    }
}

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

预先感谢!开尔文

javascript javascript-objects collision-detection collision intersection
1个回答
0
投票

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

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

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

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

返回布尔值将表示您是否发生碰撞,如果是这样,则在读取函数结果时减慢速度。

因此移动移动的项目,然后使用功能检查是否有碰撞,如果有任何碰撞,请调整位置并停止移动。

我不知道这些技术是否对您有用,因为在我的游戏中,坐标大多是整数(除了跳跃时,我在那里做了一些浮点四舍五入的技巧),但我认为总体概念可能是相似的。

© www.soinside.com 2019 - 2024. All rights reserved.