我有以下旋转功能:
public void rotate( Actor a ) {
float rotateBy = 30.0f,
newX = ( a.getX() * ( float ) Math.cos( rotateBy ) ) - ( a.getY() * ( float ) Math.sin( rotateBy ) ),
newY = ( a.getX() * ( float ) Math.sin( rotateBy ) ) + ( a.getY() * ( float ) Math.cos( rotateBy ) ),
moveByX = a.getX() - newX, // delta
moveByY = a.getY() - newY, // delta
duration = 1.0f; // 1 second
a.addAction(
Actions.sequence(
Actions.parallel(
Actions.rotateBy( rotateBy, duration ),
Actions.moveBy( moveByX, moveByY, duration )
)
)
);
}
但似乎 moveByX 和 moveByY 值不准确。
目标是弄清楚旋转后新的x,y是多少,并向上移动那么多,以便它仍然保持与旋转前相同的y。
另外,我的演员的绘画方法:
@Override
public void draw( Batch batch, float parentAlpha ) {
batch.draw( texture, getX(), getY(), getWidth()/2, getHeight()/2, getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation() );
}
答案 0 :(得分:1)
这就是我这样做的方式:首先,演员的原点必须是正方形的中心,然后在其中心旋转演员,你会看到类似的东西
红线表示演员需要向上移动才能跟随发言权的y偏移量,因为你可以看到这个y偏移量的增加和减少(所以也许你不能使用Actions.moveBy因为这会沿着线性方式移动它而你的路径不是线性的,请看蓝线)所以
Vector2 pos = new Vector2();
public void rotate(float delta, Actor a) {
a.rotateBy(angularSpeed*delta);
pos.x += linearSpeed*delta;
a.setPosition(pos.x,pos.y+yOffset(a.getRotation());
}
yOffset是根据方形旋转角度描述红线长度的函数:
public float yOffset(float angle) {
angle %= Math.PI/2;
return (float) Math.abs(squareSize*(Math.sin((Math.PI/4+angle))-Math.sin(Math.PI/4)));
}
所有角度都是弧度。