2

スプライトキットの基本を学ぶために、「大理石」の迷宮ゲームを作成しています。

ゲームの重力をデバイスの傾きにマッピングしたい。私はそれを行う方法を理解しようとしてきましたが、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) である必要がありますが、attitude.roll は -179 を返します。また、デバイスを垂直 (ポートレート モード) に保ち、デバイスを静止させたまま足をオンにすると、重力 (x: 0, y: 1) が維持されますが、x は Attitude.roll に基づいているため、変化し続けます。

これはどのように行うことができますか?

4

1 に答える 1

1

最も簡単な方法は、デバイスの動きの更新ではなく、加速度計の更新を取得し、そこから重力ベクトルを直接読み取ることです。これはまさに加速度計がキャプチャするものであり、デバイスの座標系での重力の測定値です。

悲しいことに、私は Swift の太い人なので、サンプル コードを提供することはできませんが、構造体を取得できる をCMAccelerometerHandler受け取るタイプのブロック、つまり適用する重力ベクトルを直接提供しようとしています。CMAccelerationDataCMAcceleration

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
于 2014-07-31T22:59:02.203 に答える