2017-01-24 7 views
2

Auf Anweisung von diesem Posten hier; Swift-Making an SKNode simply "move forward" on an angle Ich habe diesen Code geschrieben, um einen Winkel randomisiert und mein Sprite in diesem Winkel anfahren haben:Swift-SKSpriteNode Geschwindigkeit ändert sich nicht

func setDegrees() { 
    let ball1Degrees:UInt32 = arc4random_uniform(360) 
    if ball1Degrees > 300 { 
     ball2Degrees = Int(ball1Degrees) - 360 
     ball3Degrees = Int(ball1Degrees) - 300 
    } 
    else if ball1Degrees > 240 { 
     ball2Degrees = Int(ball1Degrees) + 60 
     ball3Degrees = Int(ball1Degrees) - 360 
    } 
    else { 
     ball2Degrees = Int(ball1Degrees) + 60 
     ball3Degrees = Int(ball1Degrees) + 120 
    } 
} 

func myFunction() { 
    ball1.position = CGPoint(x: 0, y: 0) 
    ball2.position = CGPoint(x: 0, y: 0) 
    ball3.position = CGPoint(x: 0, y: 0) 
    setDegrees() 
    if ball1Degrees < 90 { 
     ball1.physicsBody?.velocity = CGVector(dx: 1, dy: tan(Double(ball1Degrees) * (.pi/180))) 
    } 
    if ball1Degrees == 90 { 
     ball1.physicsBody?.velocity = CGVector(dx: 1, dy: 0) 
    } 
    if ball1Degrees > 90 && ball1Degrees <= 180 { 
     ball1.physicsBody?.velocity = CGVector(dx: -1, dy: tan(Double(180 - ball1Degrees) * (.pi/180))) 
    } 
    if ball1Degrees > 180 && ball1Degrees <= 270 { 
     ball1.physicsBody?.velocity = CGVector(dx: -1, dy: -tan(Double(ball1Degrees - 180) * (.pi/180))) 
    } 
    if ball1Degrees > 270 && ball1Degrees <= 0 { 
     ball1.physicsBody?.velocity = CGVector(dx: 1, dy: -tan(Double(360 - ball1Degrees) * (.pi/180))) 
    } 
    if ball2Degrees < 90 { 
     ball2.physicsBody?.velocity = CGVector(dx: 1, dy: tan(Double(ball2Degrees) * (.pi/180))) 
    } 
    if ball2Degrees == 90 { 
     ball2.physicsBody?.velocity = CGVector(dx: 1, dy: 0) 
    } 
    if ball2Degrees > 90 && ball2Degrees <= 180 { 
     ball2.physicsBody?.velocity = CGVector(dx: -1, dy: tan(Double(180 - ball2Degrees) * (.pi/180))) 
    } 
    if ball2Degrees > 180 && ball2Degrees <= 270 { 
     ball2.physicsBody?.velocity = CGVector(dx: -1, dy: -tan(Double(ball2Degrees - 180) * (.pi/180))) 
    } 
    if ball2Degrees > 270 && ball2Degrees <= 0 { 
     ball2.physicsBody?.velocity = CGVector(dx: 1, dy: -tan(Double(360 - ball2Degrees) * (.pi/180))) 
    } 
    if ball3Degrees < 90 { 
     ball3.physicsBody?.velocity = CGVector(dx: 1, dy: tan(Double(ball3Degrees) * (.pi/180))) 
    } 
    if ball3Degrees == 90 { 
     ball3.physicsBody?.velocity = CGVector(dx: 1, dy: 0) 
    } 
    if ball3Degrees > 90 && ball3Degrees <= 180 { 
     ball3.physicsBody?.velocity = CGVector(dx: -1, dy: tan(Double(180 - ball3Degrees) * (.pi/180))) 
    } 
    if ball3Degrees > 180 && ball3Degrees <= 270 { 
     ball3.physicsBody?.velocity = CGVector(dx: -1, dy: -tan(Double(ball3Degrees - 180) * (.pi/180))) 
    } 
    if ball3Degrees > 270 && ball3Degrees <= 0 { 
     ball3.physicsBody?.velocity = CGVector(dx: 1, dy: -tan(Double(360 - ball3Degrees) * (.pi/180))) 
    } 

} 

myFunction() 

Aber wenn mein Spiel ausgeführt wird, keine der oben genannten Geschwindigkeitsänderungen erscheinen angewendet werden wird. Die Neupositionierung in der Mitte des Bildschirms wird erfolgreich ausgeführt, und es gibt sogar ein paar Skalierungs-SKAction-Befehle, die hier nicht besonders relevant sind, die gut funktionieren. Warum ändert sich die Geschwindigkeit nicht? Ist es zu viel Code für den Simulator meines Computers? Oder habe ich irgendwo einen Fehler gemacht? Ich wäre für jede Rückmeldung dankbar.

Vielen Dank im Voraus.

+0

Haben Sie vergessen, die Physic zu erstellen Körper? Ändern Sie 'physicsBody?' In 'physicsBody!'. Schau, ob es abstürzt. Wenn dies der Fall ist, bedeutet das, dass Sie vergessen haben, die Physikkörper zu erstellen. – Sweeper

+0

Im Attribute-Inspektor meines Sprites in meinem GameScene.sks habe ich Physik-Körper vom Typ Bounding Circle zugewiesen, aber trotzdem passiert nichts. Muss ich etwas hinzufügen, um sie in meinem GameScene.swift zu erstellen? Oder gibt es im Attribut-Inspektor eine Einstellung, die ich sicherstellen muss, dass eine bestimmte Art und Weise festgelegt ist, dass es verschoben werden darf? –

+0

Ich habe auch nur Ihren Vorschlag versucht, und nein, es stürzt nicht ab? Irgendwelche anderen Ideen? –

Antwort

0

Es gibt ein paar Dinge, die Sie falsch gemacht haben. Aber sie sind wirklich einfach zu reparieren.

Vor allem in meiner anderen Antwort, erwähnte ich das Verhältnis von dx: dy, nicht die Werte von dx und dy. Derzeit sind die Geschwindigkeiten Ihrer Knoten sehr langsam, so dass Sie keinen Unterschied sehen können. Multiplizieren dx und dy von 100:

ball1.physicsBody?.velocity = CGVector(dx: 100, dy: -tan(Double(360 - ball1Degrees) * (.pi/180)) * 100) 

Auch diese if-Anweisung nicht ausgeführt wird:

if ball1Degrees > 270 && ball1Degrees <= 0 { 

Ich glaube, Sie sollten versuchen:

if ball1Degrees > 270 && ball1Degrees <= 360 { 
+0

Ah, ich verstehe. Ich änderte die <= 0 Sache und multiplizierte die dx und dy um jeweils 50. Aber jetzt, wenn die Funktion ausgeführt wird, verschwinden die Sprites einfach. Zumindest bevor sie in die Mitte gingen und wie angewiesen skalierten. Jetzt bewegen sie sich überhaupt nicht, nicht zur Mitte, nicht zur Skalierung, einfach nichts. Ich vermute, dass dies nur der Simulator meines Computers ist, der das alles nicht verarbeitet, aber es ist immer noch seltsam ... –