如何使用libgdx,scene2d中最短的方向旋转actor?

时间:2014-04-12 15:10:41

标签: java android libgdx

当我想使用RotateToAction旋转演员时,例如从0度到300度,演员旋转300度(duh),但逆时针旋转60度也是如此,这就是我想要的。

如果我使用RotateByAction并将角度设置为负60度,我会得到我的演员的负旋转值,这也不是我想要的。

那么如何使用任一动作将我的演员旋转到某个角度,总是使用最短的旋转并保持0到360之间的正旋转值?

2 个答案:

答案 0 :(得分:0)

不清楚你的意思是"保持正旋转值"。如果要将actor旋转到270度,可执行的最短旋转为-90度。逆时针旋转本质上是负面的......

假设您只想指定 0到360之间的度数值,并让 actor 弄清楚是顺时针还是逆时针旋转,您可以尝试写你自己的行动。这样的事情怎么样?

public class MyRotateAction extends Action {
    private Actor actor;
    private int finalDegrees;

    public MyRotateAction(Actor actor, int finalDegrees) {
        this.actor = actor;
        this.finalDegrees = finalDegrees;
    }

    @Override
    public boolean act(float delta) {
        if (finalDegrees - actor.getRotation() > 180) { //perform negative rotation
            actor.addAction(rotateBy(actor.getRotation() - finalDegrees));
        } else { //perform positive rotation
            actor.addAction(rotateBy(finalDegrees - actor.getRotation());
        }
    }
}

答案 1 :(得分:0)

尝试将角色与0到360之间的值保持一致,这取决于游戏的一切:

float a = actor.getRotation();
if(a > 360) 
    a -= 360;
if(a < 0) 
    a += 360;
actor.setRotation(a);

找到要旋转到的最接近的角度值,其距离演员角度小于或等于180°,例如:

float degrees = angle_to_rotate_to;
float a = actor.getRotation();

if(degrees-a < 180) degrees += 360;
if(degrees-a > 180) degrees -= 360;

或者,如果您不想将演员角度限制为0和360:

float degrees = angle_to_rotate_to;
float a = actor.getRotation();
while (degrees-a < 180) degrees += 360;
while (degrees-a > 180) degrees -= 360;