2013-09-30 17 views
8

Mit dem IOS SpriteKit herumspielen mit SKSprites, und ich möchte grundsätzlich ein Sprite nach dem Zufallsprinzip eine bestimmte Richtung für eine bestimmte Entfernung bewegen, dann eine neue zufällige Richtung und Entfernung wählen. Einfach genug, erstellen Sie eine Methode, die die Zufallszahlen erzeugt, dann erstellt die Animation und im Completion-Block der Animation haben Sie die gleiche Routine Callback.Wie bewegt man einen IOS SKSprite mit konstanter Geschwindigkeit?

Dies funktioniert zwar, aber es verhindert auch, dass sich die Animation mit derselben Geschwindigkeit bewegt, da die Animationen alle auf Dauer basieren. Wenn das Objekt 100 bewegt werden soll, bewegt es sich mit der Hälfte der Geschwindigkeit Zufällig sagt er, dass er 200 bewegen soll ... Also, wie zum Teufel soll ich es mit einer konstanten Geschwindigkeit bewegen?

+1

Sie sollen nach dem Code Sie zu bestimmen, verwenden (und animieren) die neue Position. Die grundlegende Antwort auf Ihre Frage ist, dass die Dauer der Animation ein festes Vielfaches der Entfernung zwischen dem aktuellen und dem nächsten Ort sein sollte, aber es wäre einfacher, dies mit einer Änderung Ihres aktuellen Codes zu erklären. –

+0

Ich habe dies getan, und während es funktioniert, es scheint nur kludgy, ich würde denken, dass es etwas in Richtung der Bewegung zu xy mit Geschwindigkeit statt alles Dauer sein könnte. – user282172

+0

Diese Art von Modell, wo Sie die Dauer pro bewegtem Pixel berechnen und dann multiplizieren, um wie viel Sie sich bewegen müssen, müssen Dinge berücksichtigen, wenn Sie x und y gleichzeitig bewegen, da 1 Pixel Diagonale tatsächlich ist eine größere Entfernung als 1 Pixel links und rechts, (Quadratwurzel von 2 vs 1) unter der Annahme, dass die Pixel selbst tatsächlich quadratisch sind. – user282172

Antwort

13

@Noah Witherspoon ist oben richtig - Pythagoras verwenden, um eine glatte Geschwindigkeit zu bekommen:

//the node you want to move 
SKNode *node = [self childNodeWithName:@"spaceShipNode"]; 

//get the distance between the destination position and the node's position 
double distance = sqrt(pow((destination.x - node.position.x), 2.0) + pow((destination.y - node.position.y), 2.0)); 

//calculate your new duration based on the distance 
float moveDuration = 0.001*distance; 

//move the node 
SKAction *move = [SKAction moveTo:CGPointMake(destination.x,destination.y) duration: moveDuration]; 
[node runAction: move]; 
3

Als Erweiterung @AndyOS ‚s Antwort, wenn du gehst, nur entlang bewegen one axis (X zum Beispiel) Sie die Mathematik, indem Sie diese stattdessen vereinfachen können:

CGFloat distance = fabs(destination.x - node.position.x); 
4

mit Swift 2.x ich habe mit diesem kleinen Verfahren gelöst:

func getDuration(pointA:CGPoint,pointB:CGPoint,speed:CGFloat)->NSTimeInterval { 
    let xDist = (pointB.x - pointA.x) 
    let yDist = (pointB.y - pointA.y) 
    let distance = sqrt((xDist * xDist) + (yDist * yDist)); 
    let duration : NSTimeInterval = NSTimeInterval(distance/speed) 
    return duration 
} 

Mit dieser Methode i einen Ivar myShipSpeed ​​verwenden kann und direkt meine Aktionen zum Beispiel nennen:

let move = SKAction.moveTo(dest, duration: getDuration(self.myShip.position,pointB: dest,speed: myShipSpeed)) 
self.myShip.runAction(move,completion: { 
    // move action is ended 
})