我正在建立一个“大理石”迷宫游戏,以便学习Spritekit基础知识。

我想将游戏的重力映射到设备的倾斜。我一直试图弄清楚如何做到这一点,但我只能成功地映射Y轴:

class func obtainGravity(motionManager: CMMotionManager) {
    var vec = CGVectorMake(0, 0)
    if let attitude = motionManager.deviceMotion?.attitude? {
        let y = CGFloat(-attitude.pitch * 2 / M_PI) // This works, it returns 1/-1 when the device is vertical (1 when the home button is upside down)
        let x = CGFloat(attitude.roll * 2 / M_PI) // This doesn't work
        physicsWorld.gravity = CGVectorMake(x, y)
    }
}   
.

我可以映射y轴,使球变为“向上”或“向下”(相对于纵向模式),但是我不明白如何映射X轴(从设备侧面拉动)。

例如,当将设备平放在表(x,y)上时应(0,0),并且当将其放在表上屏幕上时,它也应该是(0,0)但是态度。态度。返回返回-179。此外,如果我保留我的设备垂直(在纵向模式上)并打开我的脚仍然保持设备,重力应保持(x:0,y:1),但是x继续改变,因为它基于态度.roll

如何完成?

有帮助吗?

解决方案

最直接的方式是采取加速度计更新,而不是设备运动更新,并直接从那里读取重力矢量 - 这正是加速度计捕获的是:设备坐标系中的重力测量。

可悲的是,我是一个迅速的加厚,所以不能提供示例代码,但你想提供一块类型的世代odicetagcode,它将接收一个人可以从中获得生成的世代odicetagcode结构,并且直接是重力矢量申请。

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top