2017-02-14 75 views
0

我试图使用内置的加速度计在x轴上移动播放器,但出了点问题。当我在iPhone上模拟应用程序时,节点会继续向各个方向移动,并且只有在关闭应用程序并再次启动后,节点才会从左向右移动,这正是我想要的。所以它的作品,但只有在关闭并再次打开应用程序后。代码奇怪的加速度计行为(CoreMotion)

部分:

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

而是改变你的场景的严重性,试图直接移动玩家。如果你调整重力,它也会搞乱你所有的其他物理机构。因此,无论是使用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以获得所需的结果。

希望这会有所帮助