2017-10-04 8 views
0

Je dois boutons leftbutton, rightbutton les deux étant SKSpriteNode(). Lorsque l'utilisateur touche l'un des boutons, il y a un petit vaisseau qui bouge à gauche et à droite tant que l'utilisateur tient le contact.Comment obtenir constamment la position x d'un objet en mouvement dans swift?

Maintenant j'ai besoin d'une fonction ou de toute autre chose qui me donne le ship.position.x tout le temps. Je suis coincé pour essayer de faire imprimer la position constamment. Je peux le faire imprimer chaque fois que le bouton est touché mais il ne l'imprime qu'une seule fois.

Dans mon didMove j'ai seulement créé les boutons et le bateau. Donc, cela devrait être plutôt hors de propos.

func moveShip (moveBy: CGFloat, forTheKey: String) { 
    let moveAction = SKAction.moveBy(x: moveBy, y: 0, duration: 0.09) 
    let repeatForEver = SKAction.repeatForever(moveAction) 
    let movingSequence = SKAction.sequence([moveAction, repeatForEver]) 
    ship.run(movingSequence, withKey: forTheKey) 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    print("\(ship.position.x)") 

    for touch: AnyObject in touches { 
     let pointTouched = touch.location(in: self) 

     if leftButton.contains(pointTouched) { 

//   !! I MAKE IT PRINT THE POSITION HERE !! 

      moveShip(moveBy: -30, forTheKey: "leftButton") 
     } 

     else if rightButton.contains(pointTouched) { 
      moveShip(moveBy: 30, forTheKey: "rightButton") 
     } 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first{ 
     let pos = touch.location(in: self) 
     let node = self.atPoint(pos) 

     if node == aButton { 

     } else { 
      ship.removeAction(forKey: "leftButton") 
      ship.removeAction(forKey: "rightButton") 
     } 
    } 
} 

Dans mon code, la position est imprimé une fois au début du toucher et non imprimé tant que le toucher et le toucher à nouveau. Y a-t-il un moyen possible de le faire avec mon code?

+0

Vous pouvez remplacer une méthode de mise à jour. Dans cette méthode, vous devriez être en mesure d'obtenir votre objet et obtenir sa position! –

+0

J'ai beaucoup lu sur cette méthode de mise à jour. Comment puis-je le remplacer? Quand j'essaie, il n'y a pas de méthode de mise à jour suggérée par xCode –

+0

Jetez un oeil à la réponse de Bharath! –

Répondre

2

Le touchesMoved fonction ne vous aidera pas à votre problème. Vous pouvez vérifier votre image en permanence en créant une variable d'instance var timer = Timer().

Vous devez ensuite configurer la minuterie et la fonction appelée à la fin d'une durée spécifique. comme suit dans Est-ce que votre fonction didMove:

timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, 
     selector: #selector(detectShipPosition), userInfo: nil, repeats: true) 

Comme cela se répète toutes les 0,01 secondes, il appellera la fonction detectShipPosition que vous mettrez en œuvre DEHORSdidMove.

func detectShipPosition(){ 
    print("\(ship.position.x)") 
} 
+1

juste essayé cela, et cela a fonctionné. eu l'idée d'utiliser la minuterie mais n'obtenait pas le bit "sélecteur". MERCI! –

1

Salut, vous pouvez utiliser la touchesMoved méthode déléguée (Il indique le répondeur quand une ou plusieurs touches associées à un événement a changé.) Comme suit,

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     print("\(ship.position.x)") 
    } 
+0

J'ai essayé ceci et il imprime la position quand je bouge le doigt. Mais quand je tiens le bouton gauche et ne bouge pas mon doigt mais maintenez le bouton, il n'imprime pas la position x en permanence .. –

1

Solution pour le commentaire que vous avez publié sur Réponse de Bharath.

Vous pouvez modifier ci-dessous avec votre propre valeur:

longGesture.minimumPressDuration 

Vous pouvez utiliser UILongPressGestureRecognizer:

class ViewController: UIViewController, UIGestureRecognizerDelegate { 
    @IBOutlet weak var leftButton: UIButton! 
    @IBOutlet weak var rightButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longPress(_:))) 
     longGesture.minimumPressDuration = 0.5 
     longGesture.delegate = self 
     leftButton.addGestureRecognizer(longGesture) 

     rightButton.addGestureRecognizer(longGesture) 

    } 

    @objc func longPress(_ gestureReconizer: UILongPressGestureRecognizer) { 
     print("\(ship.position.x)") 
    } 
} 
+0

sonne vraiment bien. mais en essayant de l'implémenter, il me donne l'erreur que leftButton n'a aucun membre "addGestureRecognizer()". Je pense que c'est parce que mon LeftButton est un SKSpriteNode pas un bouton. –

0

Si vous implémentez la fonction mise à jour() dans la scène, il sera appelé pour chaque image et vous pouvez vérifier la position de votre objet (et l'existence) là-bas pour imprimer la valeur quand il change:

override func update(_ currentTime: TimeInterval) 
{ 
    if let ship = theShipSprite, 
     ship.position != lastPosition 
    { 
     print(ship.position) // or whatever it is you need to do 
     lastPosition = shipPosition 
    } 
}