7

使用 Sprite Kit 我试图SKPhysicsBody根据给定的角度设置移动,例如,如果您希望精灵向右移动,您可以指定 1.571 弧度。要将指定的角度转换为速度,我使用以下方法将弧度转换为CGVector. 我从记忆中实现的原始版本具有将所有角度偏移 90 度的奇怪效果。(即,如果使用 0 度,则精灵向右移动(就像您指定 90 度时一样)

问题:

我通过交换dxdy分配在新版本中修复了这个问题。我的问题是为什么会发生这种情况,我在原件中是否有错误(似乎确实有其他人在网络上这样做)或者是否存在基于所使用的特定坐标系的某些原因。

// ORIGINAL
- (CGVector)convertAngleToVector:(CGFloat)radians {
    CGVector vector;
    vector.dx = cos(radians) * 10;
    vector.dy = sin(radians) * 10;
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy);
    return vector;
}


// NEW, SWAPPED DX & DY
- (CGVector)convertAngleToVector:(CGFloat)radians {
    CGVector vector;
    vector.dy = cos(radians) * 10;
    vector.dx = sin(radians) * 10;
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy);
    return vector;
}

注意:在 Sprite Kit 中,顺时针旋转也是负数,到目前为止convertAngleToVector是正顺时针旋转(即 1.571 弧度是正确的,应该在左边)我可以这样做cos(radians*-1)sin(radians*-1)但是基于我交换 dx 可能有一些潜在的原因和dy。

雪碧套件(SKView 坐标):

在此处输入图像描述

4

2 回答 2

3

是的,SpriteKit 默认是右边的。Physics Collision 示例项目通过实现此方法解决了这个问题:

- (CGFloat)shipOrientation
{
    // The ship art is oriented so that it faces the top of the scene, but Sprite Kit's rotation default is to the right.
    // This method calculates the ship orientation for use in other calculations.
    return self.zRotation + M_PI_2;
}

然后,您可以通过调用以下内容来获取现有方向:

CGFloat shipDirection = [self shipOrientation];

然后从那里调整 zRotation 属性。

于 2014-01-09T01:42:25.227 回答
2

来自Sprite Kit Programming Guide(强调添加):

Sprite Kit 也有一个标准的旋转约定。图 4-2 显示了极坐标约定。0 弧度的角度指定正 x 轴。正角是逆时针方向。

在这个坐标系中,一个零弧度指向右边的角度是正确的。如果您想使用一个零角度垂直向上(沿着正 y 轴)并顺时针增加的系统,您需要先转换角度,然后再将它们转换为矢量。

于 2013-10-08T17:29:07.440 回答