2017-02-14 4 views
0

J'essayais de déplacer le lecteur sur l'axe des x en utilisant l'accéléromètre intégré, mais quelque chose ne va pas. Lorsque je simule l'application sur mon iPhone, le nœud continue de se déplacer dans toutes les directions et seulement après 2-3 fois quand je ferme l'application et la relance, le nœud se déplace de gauche à droite, ce que je voulais. Donc, cela fonctionne, mais seulement après la fermeture et l'ouverture de l'application à nouveau.Comportement d'accéléromètre étrange (CoreMotion)

Une partie du code:

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(){ 
     //... 
    } 

} 

Répondre

1

Au lieu de changer la gravité de votre scène essayer de déplacer le joueur directement. Si vous ajustez la gravité, cela gâchera tous vos autres corps physiques. Donc soit déplacez le joueur avec un SKAction ou mieux en lui appliquant une Force.

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

Je recommande également que vous n'utilisez pas le gestionnaire pour les mises à jour de mouvement, je ne ai jamais eu des résultats précis à l'utiliser.

donc supprimer ce bloc de code

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") 
     } 

    } 

et aller plutôt à la méthode de mise à jour de votre scène et récupérer les données de mouvement à partir de là.

override func update(_ currentTime: TimeInterval) { 

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

Cela rendra tout beaucoup plus fluide et réactif. Ajustez le 30 pour obtenir le résultat désiré.

Espérons que cela aide