2016-07-12 14 views
0

Ich habe ein paar Sprites in einem schnellen Spiel, die identische Aktionslisten haben (technisch [SKAction]). Sie sind alle an verschiedenen Stellen in der Action-Sequenz, und ich muss sie in der Reihenfolge der vollständigsten (mit der Aktion) zu am wenigsten vervollständigen. Wie bekomme ich den Fortschritt eines Sprites (oder zumindest den Schritt der Aktion)? Am liebsten würde ich den Prozentsatz der Fertigstellung für den Schritt erhalten, auf dem es läuft.Swift: Überprüfung der Fortschritte auf SKActions

Aus Gründen der Beispielcode:

let sprite1 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5) 
    let sprite2 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5) 
    let sprite3 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5) 

    sprite1.position = CGPoint(x: -100, y: 0) 
    sprite2.position = CGPoint(x: 0, y: 0) 
    sprite3.position = CGPoint(x: 100, y: 0) 

    let sequence : [SKAction] = [SKAction.move(by: CGVector(dx: 50, dy: 0), duration: 1.5), 
           SKAction.rotate(byAngle: CGFloat(M_PI/2), duration: 1.0), 
           SKAction.move(by: CGVector(dx: 0, dy: 50), duration: 1.5), 
           SKAction.rotate(byAngle: CGFloat(M_PI/2), duration: 1.0), 
           SKAction.move(by: CGVector(dx: -50, dy: 0), duration: 1.5)] 

    sprite1.run(SKAction.sequence(sequence)) 
    //wait 1 second 
    sprite2.run(SKAction.sequence(sequence)) 
    //wait another second 
    sprite3.run(SKAction.sequence(sequence)) 

    var spriteAccord : [SKSpriteNode] = //insert ranking code 
+0

Bitte posten Sie Ihre echten Code, dies nicht – Eric

+1

tut kompilieren Sie basiert auf Zeit Rang benötigen oder welche Maßnahmen sie in – Knight0fDragon

+0

Es wäre was für eine Aktion sie sind (wie ich vergessen habe zu erwähnen, dass sie mit unterschiedlichen Geschwindigkeiten laufen können). Also werde ich ein Wörterbuch von Startzeiten nehmen und die verschiedenen Geschwindigkeiten verwenden, um "Entfernung" entlang der Sequenz zu berechnen und die zurückgelegte Distanz zu verwenden, um Ranglisten zu erhalten –

Antwort

1

Solange die Geschwindigkeit des Sprites konstant (AKA keine Kugel Zeiteffekt) Ich würde nur ein Wörterbuch verwenden Startzeiten zu speichern:

var startingTimes = [SKNode:NSTimeInterval]() 

Dann speichern, wenn ein Sprite beginnt seine Sequenz

sprite1.run(SKAction.sequence(sequence)) 
startingTimes[sprite1 as! SKNode] = currentTime 

Schließlich sortieren nach der startingTime

let sortedStartingTimes = startingTimes.sort(){ 
          (time1,time2)->Bool in 
          return time1 <= time2 
         } 

Dann, gerade Iterierte th rauhe das Wörterbuch, oder schnapp dir den ersten Gegenstand, was immer du hier tun musst.

Dies kann in Spielplätze geknallt werden, um die oben genannten Code zu testen:

var startingTimes = [String:NSTimeInterval]() 
startingTimes["A"] = 1 
startingTimes["C"] = 3 
startingTimes["B"] = 2 

let sortedStartingTimes = startingTimes.sort(){ 
    (time1,time2)->Bool in 
    return time1 <= time2 
} 
print("start") 
for time in startingTimes 
{ 
    print(time) 
} 
print("sort") 
for time in sortedStartingTimes 
{ 
    print(time) 
} 

Um ein wenig komplexer den Prozentsatz der Fertigstellung zu erhalten. Sie müssen Ihr currentTime - startingTime nehmen und dann herausfinden, wo Sie in Ihrem Sprite sind.

Also habe ich insgesamt 3 Schritte, jeweils 1 Sekunde.

Meine aktuelleZeit - Startzeit ist 1,5 Sekunden.

var deltaTime = currentTime - startingTime 

Ich nehme 1.5 - Schritt 1 Mal, so ergibt sich 0,5 Sekunden

deltaTime -= step1Time 

DELTA> 0, ich bin in einem neuen Schritt

Ich nehme 0,5 - Schritt 2 Mal , so ergibt sich 0,5 Sekunden

deltaTime -= step2Time 

DELTA < = 0 I in diesem Schritt am

012.351.

so DELTA/step2time, das ist mein Anteil im Schritt 2 Timeline

let completionPercentage = deltaTime/step2Time 
1

Sie können runBlock Aktionen zwischen Ihren bestehenden Aktionen einfügen. In dem Block können Sie dann Zähler erhöhen, um den Fortschritt jedes Knotens über die Aktionen zu verfolgen.

Verwandte Themen