2017-10-04 3 views
0

Ich muss Tasten leftbutton, rightbutton beide von ihnen SKSpriteNode() sein. Wenn der Benutzer eine der Schaltflächen berührt, bewegt sich ein kleines Schiff nach links und rechts, solange der Benutzer die Berührung hält.Wie bekomme ich die x-Position eines bewegten Objekts schnell?

Jetzt brauche ich eine Funktion oder irgendetwas anderes, das mir die ship.position.x die ganze Zeit gibt. Ich bleibe stecken, um zu versuchen, es die Position ständig zu drucken. Ich kann es jedes Mal drucken, wenn der Knopf berührt wird, aber es druckt es nur einmal.

In meinem didMove habe ich nur die Tasten und das Schiff erstellt. Also sollte es eher irrelevant sein.

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

In meinem Code wird die Position nur einmal zu Beginn des Touch gedruckt und nicht gedruckt, bis Sie die Berührung und berühren Sie es wieder los. Gibt es eine Möglichkeit, dies mit meinem Code zu tun?

+0

Sie können eine Aktualisierungsmethode überschreiben. In dieser Methode sollten Sie in der Lage sein, Ihr Objekt zu bekommen und Position zu bekommen! –

+0

Ich habe viel über diese Update-Methode gelesen. Wie kann ich es überschreiben? Wenn ich versuche, gibt es keine Update-Methode von xCode empfohlen –

+0

Werfen Sie einen Blick auf Bharath Antwort! –

Antwort

2

Die touchesMoved Funktion werden Sie nicht mit Ihrem speziellen Problem helfen. Sie können Ihren Frame ständig überprüfen, indem Sie eine var timer = Timer() als Instanzvariable erstellen.

Anschließend müssen Sie den Timer und die Funktion einrichten, die nach Ablauf einer bestimmten Zeit aufgerufen wird. Sie wie folgt in Ihrer didMove Funktion:

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

Da diese sich alle 0,01 Sekunden wiederholen wird es die Funktion detectShipPosition nennen, die Sie OUTSIDEdidMove umsetzt.

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

habe gerade versucht, und es hat funktioniert. hatte die Idee, den Timer zu verwenden, bekam aber nicht das "Selektor" -Bit. VIELEN DANK! –

1

Hallo können Sie die Verwendung der touchesMoved Delegatmethode (Erzählt wird die Responder, wenn eine oder mehr Berührungen im Zusammenhang mit einer Veranstaltung geändert.) Machen, wie folgt,

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

Ich habe das versucht und es druckt die Position, wenn ich den Finger bewege. Aber wenn ich den linken Knopf halte und nicht meinen Finger bewege, sondern den Knopf halte, druckt er nicht ständig die x-Position. –

1

Lösung für den Kommentar, den Sie geschrieben auf Bharath antwortet.

Sie unten mit Ihrem eigenen Wert ändern:

longGesture.minimumPressDuration 

können Sie UILongPressGestureRecognizer verwenden:

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

klingt wirklich nett. aber versuchen, es zu implementieren, es gibt mir den Fehler, dass leftButton hat kein Mitglied "addGestureRecognizer()". Ich denke, das liegt daran, dass mein leftButton ein SKSpriteNode ist, kein Button. –

0

Wenn Sie das Update() Funktion in der Szene implementieren, wird es für jeden Frame aufgerufen werden und Sie können Ihre Objektposition (und Existenz) überprüfen dort den Wert zu drucken, wenn sie sich ändert:

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 
    } 
} 
Verwandte Themen