0

デバイスのモーション データを取得し、重力の方向を変更して、iPhone を傾けるとボールが傾斜方向に移動するようにしようとしています。このチュートリアルでは、メソッドはノードで加速度データと applyForce を取得しています。ただし、重力の方向を変更することでこの目標を達成したいと考えています (電話をどのように傾けても、重力は常に実際の物理的な重力の方向に沿っています)。

これが私のコードです:

import SpriteKit
import CoreMotion
class GameScene: SKScene {
let ballName = "redBall"
var gravityDirection = CGVectorMake(0,-9.8)


let motionManager = CMMotionManager()
let motion = CMDeviceMotion()

func addBall(){
    //Create the ball
    var ball = SKShapeNode()
    var path = CGPathCreateMutable()
    CGPathAddArc(path, nil, 0, 0, 45, 0, CGFloat(M_PI * 2), true)
    CGPathCloseSubpath(path)
    ball.name = ballName
    ball.path = path
    ball.lineWidth = 2.0
    ball.fillColor = SKColor(red: 0.95, green: 0.2, blue: 0.2, alpha: 0.9)
    ball.position = CGPoint(x:size.width/2, y: size.height)

    //Set the ball's physcial properties
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.width/2)
    ball.physicsBody!.dynamic = true
    ball.physicsBody!.mass = 0.1
    ball.physicsBody!.friction = 0.2
    ball.physicsBody!.restitution = 0.9
    ball.physicsBody!.affectedByGravity = true

    self.addChild(ball)
}

func gravityUpdated(){
    let vector = CGVectorMake(CGFloat(motion.gravity.x), CGFloat(motion.gravity.y))
    self.physicsWorld.gravity = vector
}

override func didMoveToView(view: SKView) {
    physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame)
    self.physicsWorld.gravity = gravityDirection
    motionManager.startDeviceMotionUpdates()
    addBall()
}


override func update(currentTime: CFTimeInterval) {
    gravityUpdated()
}
}

上記のコードでは、CMDeviceMotion を使用して重力データを取得し、重力値をphysicsWorld.gravity に渡します。アプリを実行すると必ずクラッシュします。

Xcode は、gravityUpdate() 関数にバグがあることを示していますが、見つけられません。誰かがこの問題を解決するのを手伝ってくれることを願っています。または、重力をシミュレートするより良い方法を教えてください。ありがとう!

4

1 に答える 1

0

私は自分でそれを理解しました。physicsworld.gravity に値を与える前に、モーション データが利用可能かどうかを確認する必要があります。

新しいコードは次のとおりです。

func gravityUpdated(){
    if let data = motionManager.deviceMotion {
        let gravity = data.gravity
        self.physicsWorld.gravity = CGVectorMake(CGFloat(gravity.x), CGFloat(gravity.y))
    }
}

デバイスモーション データが利用できない場合、プロパティの値は nil であることに注意してください。 CMMotionManager クラス リファレンス

于 2015-01-29T18:01:55.480 に答える