gpt4 book ai didi

java - "Perfect"碰撞检测算法修复

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:08:41 25 4
gpt4 key购买 nike

我正在制作一个游戏,我需要让我的物体发生碰撞,但是我有很多快速的小物体和正常的碰撞算法(形状的交集等)不起作用,因为位置+速度迭代推进了墙壁和实际上从来没有交叉路口。

所以我开始构建我自己的(也许它已经存在但我没有在任何地方看到它)基于保存对象的最后位置的碰撞算法。

请看下图:

enter image description here

图像的第 1 帧和第 2 帧展示了这个想法。基本上通过检查最后一个矩形的左侧和新矩形的右侧之间是否有墙,我在检查碰撞时从不跳过区域,并且没有跳过墙的风险(所以我想)。

这是算法的代码:

    private void bounce(GameElement b, Terrain t)
{
Rectangle tR = t.getRectangle();
int tRleft = tR.x;
int tRright = tR.x+tR.width;
int tRup = tR.y;
int tRdown = tR.y+tR.height;

Rectangle bRnow = b.getRectangle();
int bRnowLeft = bRnow.x;
int bRnowRight = bRnow.x+bRnow.width;
int bRnowUp = bRnow.y;
int bRnowDown = bRnow.y+bRnow.height;

Rectangle bRlast = b.getRectangleLast();
int bRlastLeft = bRlast.x;
int bRlastRight = bRlast.x+bRlast.width;
int bRlastUp = bRlast.y;
int bRlastDown = bRlast.y+bRlast.height;

boolean leftRight = false, rightLeft=false, upDown=false, downUp=false;
boolean betweenX = false, betweenY = false;

if(bRnow.x>bRlast.x)leftRight=true;
if(bRnow.x<bRlast.x)rightLeft=true;
if(bRnow.y>bRlast.y)upDown=true;
if(bRnow.y<bRlast.y)downUp=true;

if(bRlastRight>tRleft && bRlastLeft<tRright) betweenX = true;
if(bRlastDown>tRup && bRlastUp<tRdown) betweenY=true;

if(leftRight)
if((tRleft>bRnowLeft || tRleft>bRlastLeft) && tRleft<bRnowRight && betweenY)
{
b.setX(tR.x-bRnow.width - 1);
}

if(rightLeft)
if((tRright<bRnowRight || tRright<bRlastRight) && tRright>bRnowLeft && betweenY)
{
b.setX(tR.x+tR.width + 1);
}

if(upDown)
if((tRup>bRnowUp || tRup>bRlastUp) && tRup<bRnowDown && betweenX)
{
b.setY(tR.y-bRnow.height - 1);
}

if(downUp)
if((tRdown<bRnowDown || tRdown<bRlastDown) && tRdown>bRnowUp && betweenX)
{
b.setY(tR.y+tR.height + 1);
}
}

之所以称为反弹,是因为它不是真正有组织的 atm,我仍然需要考虑如何构建算法,使其变得更加通用和实用(也希望得到帮助)

这种碰撞方式目前有一个错误,如图 3 所示(抱歉画了圆圈,它们应该是正方形)因为 FAST 对象仍然通过对角线:/另一方面,直接撞击墙壁非常整洁。

我如何改进、优化和组织这个算法?或者有没有更好的算法,我只是想多了没用?感谢您的帮助。

最佳答案

轴对齐的边界框树通常非常适合检测物体碰撞。 Here is a tutorial with some code - 它的示例用于 3D 碰撞检测,但数据结构可以很容易地适应 2D 碰撞检测。

关于java - "Perfect"碰撞检测算法修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com