gpt4 book ai didi

java - 我应该如何更改旋转线的碰撞检测?

转载 作者:行者123 更新时间:2023-12-02 07:16:33 25 4
gpt4 key购买 nike

我为我的“线”创建了一个矩形,它是一个旋转的“激光瞄准器”

public Rectangle getLaserBox() {
float lOriginX = (leon.getPosition().x + 0.27f);
float lOriginY = (leon.getPosition().y + 0.7f);
float lEndX = lOriginX + (float)Math.cos((leonAimLaserSprite.getRotation())/57) * 5f;
float lEndY = lOriginY + (float)Math.sin((leonAimLaserSprite.getRotation())/57) * 5f;
Rectangle laserBox = new Rectangle(lOriginX, lOriginY, lEndX, lEndY);
return laserBox;
}

然后我有一个方法来检查矩形的重叠,并且如果检测到重叠,则应该缩短“激光瞄准器” Sprite 。我现在在渲染方法中调用 LaserCol() 方法(我知道我正在破坏 MVC,只是想让它工作),并且我的 LaserWidth 被应用为激光 Sprite 的宽度。

private float laserWidth;

public void laserCol() {
Vector2 laserOrigin = new Vector2(leon.getPosition().x + 0.55f, leon.getPosition().y + 0.7f);
boolean laserIsCol = false;
for (Tile t : world.getTiles()) { //pulling in tiles as t, from world method getTiles()
laserWidth = laserOrigin.dst(t.getPosition().x + 0.1f, t.getPosition().y + 0.7f);
if (Intersector.overlapRectangles(getLaserBox(), t.getBounds())) {
laserIsCol = true;
}
}
if (laserIsCol) {
for (Tile t : world.getTiles()) { //pulling in tiles as t, from world method getTiles()
laserWidth = laserOrigin.dst(t.getPosition().x, t.getPosition().y + t.getBounds().y);
}
}
if (!laserIsCol) {
laserWidth = 8f;
}
}

但正如您在屏幕截图中看到的,激光并没有缩短。我看过其他例子,但似乎无法理解更好的方法来做到这一点。 enter image description here

因此,在添加了我在代码中称为“thing”的单个对象后,我决定检查我创建的 Sprite 边界框,它看起来像这样。

enter image description here

之后,我更改了一些代码,并尝试使用射线,我已经让它在某种程度上工作了,但它并不像我想要的那么接近,有什么建议吗?

public Ray getLaserRay() {
lOriginX = (leon.getPosition().x + 0.27f);
lOriginY = (leon.getPosition().y + 0.7f);
lEndX = lOriginX + (float)Math.cos((leonAimLaserSprite.getRotation())/57) * 10f;
lEndY = lOriginY + (float)Math.sin((leonAimLaserSprite.getRotation())/57) * 10f;
laserO = new Vector3(lOriginX, lOriginY, 0);
laserD = new Vector3(lEndX, lEndY, 0);
Ray laserRay = new Ray(laserO, laserD);
return laserRay;
}


private float laserWidth;

public void laserCol() {
Vector2 laserOrigin = new Vector2(leon.getPosition().x + 0.55f, leon.getPosition().y + 0.7f);
boolean laserIsCol = false;
if (Intersector.intersectRayBoundsFast(getLaserRay(), thing.getBB())) {
laserIsCol = true;
}
if (laserIsCol) {
laserWidth = laserOrigin.dst(thing.getPosition().x, thing.getPosition().y);
}
if (!laserIsCol) {
laserWidth = 10f;
}
}

enter image description here enter image description here

我最终使用了 2 条线段来使碰撞检测正常工作。我为激光瞄准器制作了一个,为我的物体(敌人)制作了一个,从较低的 x 点延伸到顶部的 x 点。基本上是相同的代码,除了我使用了 libgdx 中的线段交集。

有人知道如何在激光瞄准点处造成子弹或损坏吗?

enter image description here

最佳答案

没有更多信息,我只能猜测,但我认为问题可能是您正在使用列表/数组中的所有图 block 来计算宽度。相反,您应该仅使用激光碰撞的瓷砖来计算宽度。

类似这样的事情:

laserWidth = 8f; //default if no collision is found
for (Tile t : world.getTiles()) { //pulling in tiles as t, from world method getTiles()
if (Intersector.overlapRectangles(getLaserBox(), t.getBounds())) {
laserWidth = laserOrigin.dst(t.getPosition().x, t.getPosition().y + t.getBounds().y);
break;
}
}

请注意,我只是重用了您的代码,我不知道这是否正确,或者其中是否有一些错误的计算。正如我在评论中所说,您应该调试计算并查看它们在哪里开始出错。

关于java - 我应该如何更改旋转线的碰撞检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14878853/

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