2016-09-01 5 views
0

Ich versuche, einen Knoten von einem Tile zu einem anderen Tile zu verschieben. Das Problem hier ist: Wenn ich dies ausfühle, wird die Position.y von Knoten etwas wie 63.9999 und nicht 64, wenn bei 32 gestartet und direkt nach dem Start des Bildschirms berührt.Warum wird SKAction.sequence nicht korrekt beendet, nachdem die letzte Aktion beendet wurde?

class A: SKScene { 

     //Changed if screen Touched 
     var abc = 0 
     var node = SKSprideNode! 

     override viewDidLoad() { 
     node.run(SKAction.repeatForever(SKAction.sequence(
       [ 
        SKAction.moveBy(x: 0, y: 32, duration: 1), 
        SKAction.run{ 
         self.node.position.y = round(self.node.position.y) 
         if self.abc != 1 { 
          self.node.removeAllActions() 
         } 
        } 
       ] 
      ))) 
     } 

     override func touchesBegan(...) { 
     abc = 1 
     } 

     override update() { 
      print(node.position.y) 
     } 

    } 

Hier wird die Ausgabe von der Konsole aus:

32.0 
32.0 
33.4936981201172 
34.4316482543945 
35.3333969116211 
36.4936981201172 
... 
... 
63.9936981201172 
64.0 
64.4936981201172 
64.4936981201172 
64.4936981201172 

es 64,0 bei der sein sollte, und warum ist es bei 64,0 nicht?

+0

ist Ihre Sprite Breite/Höhe eine seltsame Größe? – Knight0fDragon

+0

Nein, wie die Kacheln 32x32 – Lirf

+0

ok, das könnte der Grund dafür sein, dass der Mittelpunkt deines Sprites 15.5.15.5 ist – Knight0fDragon

Antwort

0

Ich möchte Begriffe für die aktuelle iOS 9, swift 2.3 verwenden.

aus dem Apple-docs:

"Die Aktion wiederholt werden, um eine nicht sofortige Dauer haben muss.".

Wenn runBlock ist eine Aktion stattfinden sofort ausgeführt. Also verwenden Sie nicht repeatActionForever, wie es verwendet werden soll.

Sie müssen nur eine leichte Verzögerung hinzufügen, und es sollte funktionieren. In der Tat, versuchen Sie, wenn Sie vor Ihren Aktionen, da dies ein wenig warten in Ihrer Sequenz zu setzen:

SKAction.waitForDuration(0.1), 
SKAction.moveBy(x: 0, y: 32, duration: 1), 
SKAction.run{ ... 

sollten Sie 64.0 erhalten, wie Sie es wünschen.

+0

Dies sollte es tun, aber die Verzögerung ist wirklich schlecht in Spielen, wenn ich den Player verschieben möchte. – Lirf

+0

@Lirf Diese Verzögerung ist nicht wahrnehmbar. Wenn Sie es nicht möchten, können Sie Ihren Code ändern, keinen Aktionsblock zum Entfernen des Knotens setzen. Sie können den abc-Status in Ihrer Aktualisierungsmethode überprüfen (prüfen Sie, ob die Aktion ausgeführt wird). Beenden Sie die Aktion mit einem Schlüssel Name und (überprüfen, ob Knoten vorhanden sind) entfernen Sie den Knoten (es ist ein besserer Weg ..) –

+0

@AlessandroOrnano, eine Verzögerung sollte nicht von Bedeutung sein, wollen wir sofort geschehen, die sequenzierte Aktion zusammen ist nicht sofort, der Runblock sollte sofort danach auslösen seine Bewegung endet, was wir wollen, und wir wissen das, weil seine Ausgabe zeigt, dass es feuert – Knight0fDragon

Verwandte Themen