2017-04-21 1 views
0

나는 sprite-kit를 사용하여 게임을 만들고 있습니다. 내 게임에서는 가속도계를 사용하여 장치를 기울여 노드를 옆으로 움직입니다. 다음 코드는 매끄럽게 작동하지만 8-10 게임을 다시 시작한 후에는 기울기에 반응하는 데 다소 시간이 걸립니다. 그런 다음 응용 프로그램을 닫으면 문제가 반복됩니다.SpriteKit 가속도계 문제

나는 didMove(to view: SKView)에서 motionManger.startAccelerometerUpdates() 가지고 보이는 기능이 같은

func processUserMotion(forUpdate currentTime: CFTimeInterval) { 



    Ball.position.x += xAcceleration * 50 // xAcceleration is a variable that is a CGFloat = 0 

    motionManger.accelerometerUpdateInterval = 0.1 
    motionManger.startAccelerometerUpdates(to: OperationQueue.current!) { (data:CMAccelerometerData?, error:Error?) in 
     if let accelerometerData = data { 
      let acceleration = accelerometerData.acceleration 
      self.xAcceleration = CGFloat(acceleration.x) * 0.75 + self.xAcceleration * 0.25 
     } 
    } 


} 

override func update(_ currentTime: TimeInterval) { 

    processUserMotion(forUpdate: currentTime) 
} 

이런 일이 왜 어떤 아이디어 나 더 나은 장치가 왼쪽으로 기울어되고 잘 때 노드 응답을 만드는 방법과 오른쪽 ? 감사!

업데이트 : accelorometer이 지체 된 이유를 드디어 알아 냈

. 내가해야 할 일은 내 GameOver 장면에 motionManger.stopAccelerometerUpdates()을 추가하는 것뿐이었습니다. 그렇게 한 후, GameScene 30 플러스 시간으로 다시 전환 할 것이고 그것은 잘 반응합니다! 희망이 작은 오류가 미래에 누군가를 도와줍니다!

+0

당신이 확인 했습니까? 그렇지 않다면, 장면 클래스에'deinit {print "deinit"}'를 추가하고 새로운 장면으로 전환하십시오. – 0x141E

+0

예 확인했는데 할당이 취소되었습니다. 내 해결책을 찾았 어. 신기한 실수! 내 gameover 함수에서 motionManger.stopAccelerometerUpdates()를 추가하는 것을 잊었습니다. – sicvayne

답변

0

CMMotionManager.startAccelerometerUpdates는 변수 중 하나에 대한 참조로 사용해야하므로 운동을 생성 할 때마다이를 실행할 필요가 없습니다.

class GameScene: SKScene { 

    private var ballNode : SKSpriteNode? 
    private let manager = CMMotionManager() 

    override func didMove(to view: SKView) { 

     self.ballNode = self.childNode(withName: "ball") as? SKSpriteNode 

     manager.startAccelerometerUpdates() 
     manager.accelerometerUpdateInterval = 0.01 
     manager.startAccelerometerUpdates(to: OperationQueue.current!){ (data:CMAccelerometerData?, error:Error?) in 
      if let accelerometerData = data { 
       let acceleration = accelerometerData.acceleration 
       self.ballNode?.physicsBody?.velocity.dx += 10*CGFloat(acceleration.x) 
      } 
     } 


    } 
    override func update(_ currentTime: TimeInterval) { 
     //nothing here 
    } 
} 

소스 코드 스위프트 3 예를 들어

: 장면이 해제되는 경우 https://github.com/Maetschl/SpriteKitExamples/tree/master/CoreMotionTest

+0

어떤 이유로 든 같은 문제가 발생합니다 ... – sicvayne

+0

그러면 코드에 다른 문제가있을 것입니다. = ( – Maetschl

+0

그게 이유가 될 수 있습니다 ... 어쨌든 고마워요! 나는이 일을 일으킬 수있는 것을보기 위해 내 발걸음을 돌아 보겠습니다. – sicvayne