奇怪的加速度计行为(CoreMotion)

时间:2017-02-14 17:33:57

标签: ios swift accelerometer core-motion cmmotionmanager

我试图使用内置的加速度计在x轴上移动玩家,但有些事情是错误的。当我在iPhone上模拟应用程序时,节点会一直向各个方向移动,只有在我关闭应用程序并再次启动它之后2-3次,节点才会从左向右移动,这就是我想要的。所以它可以工作,但只有在关闭并再次打开应用程序之后。

部分代码:

import Foundation
import SpriteKit
import CoreMotion

class Gameplay : SKScene{

    private var player : Player?

    var motionManager = CMMotionManager()

    override func update(_ currentTime: TimeInterval) {
        self.player?.move()
    }

    func initializeGame(){
        player = childNode(withName: "player") as? Player!
        player?.initPlayer()
    }

    override func didMove(to view: SKView) {

        initializeGame()

        motionManager.startAccelerometerUpdates()
        motionManager.accelerometerUpdateInterval = 0.1
        motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data , _) in
            if let accelerometerData = data{
                print("x: \(accelerometerData.acceleration.x)")
                print("y: \(accelerometerData.acceleration.y)")
                self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.x*10, dy: 0) //only x axis?
            } else {
                print("NOPE")
            }

        }
    }

Player.swift:

import Foundation
import SpriteKit

class Player : SKSpriteNode{

    func initPlayer(){
        name = "Player"

        physicsBody?.affectedByGravity = true
        physicsBody?.isDynamic = true

    }

    func move(){ //boundaries
        if position.x >= 315{
            position.x = 315
        } else if position.x <= -315{
            position.x = -315
        }
    }

    func shoot(){
       //... 
    }

}

1 个答案:

答案 0 :(得分:1)

尝试直接移动播放器,而不是改变场景的重力。如果你调整重力,它也会弄乱你所有的其他物理机构。因此,要么通过对其施加强制,请使用SKAction或更好的方式移动玩家。

 player?.physicsBody?.applyForce(CGVector(dx: 30 * CGFloat(accelerometerData.acceleration.x), dy: 0))

我还建议你不要使用处理程序进行动作更新,我从来没有得到使用它的准确结果。

请删除此代码块

 motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data , _) in
        if let accelerometerData = data{
            print("x: \(accelerometerData.acceleration.x)")
            print("y: \(accelerometerData.acceleration.y)")
            self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.x*10, dy: 0) //only x axis?
        } else {
            print("NOPE")
        }

    }

而是转到场景的更新方法并从那里获取运动数据。

override func update(_ currentTime: TimeInterval) {

   if let accelerometerData = motionManager.accelerometerData {
      player?.physicsBody?.applyForce(CGVector(dx: 30 * CGFloat(accelerometerData.acceleration.x), dy: 0))
   }
    ....
}

这将使一切变得更加顺畅和敏感。调整30以获得所需的结果。

希望这有帮助