gpt4 book ai didi

java - Libgdx 旋转至与 Vector2s 成一定角度

转载 作者:行者123 更新时间:2023-11-30 08:05:38 25 4
gpt4 key购买 nike

我正在尝试让玩家旋转并面向目标位置,但遇到了无法修复的问题。

当飞船向目标位置旋转时,当到达目标位置正下方时,它会疯狂地左右移动,同时向下(远离目标位置),最终离开屏幕。

我不想限制屏幕,因为如果接近屏幕限制,缓慢旋转时会看起来很奇怪。在这种情况下,如果我限制屏幕,它仍然会卡在底部,因为它不断向左和向右转动。我在 imgur 上上传了一张图片,试图更好地解释我的问题。

黄色是船舶移动的方向(它正在向目标位置旋转,但会越过红线),绿色是朝向目标位置的虚 vector ,红色是另一个虚 vector ,代表船舶何时疯狂。当绿线到达红线上方时,飞船开始跳出屏幕。

public void ai() {
switch (playerArrived()) {
case 0:
break;
case 1:
pTargetPos.set(ran(0, Gdx.graphics.getWidth()), ran(0, Gdx.graphics.getHeight()));
System.out.println("Player Destination Reached: " + pPos.x + "," + pPos.y + " Moving to new point: " + pTargetPos.x + "," + pTargetPos.y);
break;
}
turn();
move();
ePlayerBody.set(pPos.x, pPos.y, pWidth);
}

public int playerArrived() {
if (pTargetPos.x < pPos.x + pWidth && pTargetPos.x > pPos.x - pWidth && pTargetPos.y < pPos.y + pHeight && pTargetPos.y > pPos.y - pHeight) {
return 1;
} else {
return 0;
}
}

public float ran(float low, float high) {
return (float) (Math.random() * (high - low + 1)) + low;
}

public void move() {
pVel.set(pTargetPos.x - pPos.x, pTargetPos.y - pPos.y);
pVel.nor();
pVel.x *= sMaxSpeed + Gdx.graphics.getDeltaTime();
pVel.y *= sMaxSpeed + Gdx.graphics.getDeltaTime();
pVel.setAngle(pNewRotation + 90);
pPos.add(pVel);
}

public void turn() {
pRotation = ((Math.atan2(pTargetPos.x - pPos.x, -(pTargetPos.y - pPos.y)) * 180.0d / Math.PI)+180.0f);
pNewRotation += (pRotation - pNewRotation) * Gdx.graphics.getDeltaTime();
System.out.println(pRotation+" "+pNewRotation);
}

我在 imgur 上上传了一张图片,试图更好地解释我的问题

image

最佳答案

当您的飞船位于目标正下方且稍偏左一点时,请调用 Math.atan2(pTargetPos.x - pPos.x, -(pTargetPos.y - pPos.y))将返回一个非常接近 π/2 的值。当你的飞船位于目标正下方且稍稍偏右时,该调用将返回 -π/2。当您越过红线时,您的方向将翻转 180 度(π 弧度)。这就是它“发疯”的原因。

你需要找到一种更好的方法来确定你应该转向哪个角度。我会就此提供建议,但我仍然不清楚您到底期望什么行为。

关于java - Libgdx 旋转至与 Vector2s 成一定角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31161928/

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