iphone - 将弧度角转换为 CGVector

标签 iphone objective-c sprite-kit skview

使用 Sprite Kit 我试图设置一个 SKPhysicsBody 根据给定的角度移动,例如,如果您希望 Sprite 向右移动,您可以指定 1.571 弧度。为了将指定的角度转换为速度,我使用以下方法将弧度转换为 CGVector。我根据内存实现的原始版本具有将所有角度偏移 90 度的奇怪效果。 (即,如果使用 0 度,则 Sprite 向右移动(就像您指定 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 可能有一些潜在的原因。

Sprite 套件(SKView 坐标):

enter image description here

最佳答案

是的,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 属性。

关于iphone - 将弧度角转换为 CGVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252930/

相关文章:

iphone - 预加载的 "Core data"数据库在更新数据库后未显示正确的新数据

ios - 无法添加文件 iOS 应用程序包

swift - 请帮助我提高 swift 中节点的速度(Sprite Kit)

swift - 使用 Sprite Kit 在 Swift 中隐藏或显示 Google Ad View

ios - 如何停止/取消 PlaySoundFileNamed?

iphone - 如何使用 NSXMLParser 查找 1 个元素

ios - 向后兼容 iOS 7 的 iPhone 纵向横向自适应 UI 示例

iphone - MKPinannotation 详细信息披露按钮 - 呈现新 View

iphone - 如何禁用 UIImagePickerController 中视频的选择按钮

objective-c - 试图使 UITableView 的 tableHeaderView 超出表格边界