1

次の回転機能があります。

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 )
            )
        )
    );
}

しかし、moveByXmoveByYの値は正確ではないようです。

目標は、回転後の新しい 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() );
    }
4

1 に答える 1

1

これは私が行う方法です。まず、アクターの原点が正方形の中心にある必要があります。次に、アクターをその中心で回転させると、次のようになります。

問題

赤い線は、フロアをたどるためにアクターを上に移動する必要がある y オフセットを表しています。直線的な方法であり、パスが直線的ではない場合は、青い線を参照してください)

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)));
}

すべての角度はラジアンです。

于 2014-05-14T00:19:55.193 に答える