2013-09-30 23 views
8

Zabawa z SKSprites w IOS SpriteKit, a ja zasadniczo chcę mieć duszka losowo przesuwać pewien kierunek na określoną odległość, a następnie wybrać nowy losowy kierunek i odległość. Wystarczy, że stworzysz metodę, która generuje losowe liczby, a następnie tworzy animację, aw bloku kończącym animację ma ona wywołanie tej samej procedury.Jak poruszasz IOS SKSprite ze stałą prędkością?

To działa, ale powoduje również, że animacja nie porusza się z tą samą prędkością, ponieważ animacje są oparte na czasie trwania. Jeśli obiekt musi się poruszać 100, porusza się o 1/2 prędkości, którą porusza się, jeśli następny losowy mówi, żeby przesunąć 200 ... Więc jak do cholery mam to przenieść ze stałą prędkością?

+1

powinien zamieścić kod, którego używasz do określenia (i animacji) do nowej pozycji. Podstawową odpowiedzią na twoje pytanie jest to, że czas trwania animacji powinien być stałą wielokrotnością odległości między bieżącą a następną lokalizacją, ale łatwiej byłoby wyjaśnić to poprzez modyfikację twojego obecnego kodu. –

+0

Zrobiłem to, i chociaż działa, wydaje się kludgy, myślę, że może być coś wzdłuż linii ruchu do Xy z prędkością, zamiast wszystko opiera się na czasie trwania. – user282172

+0

Ten rodzaj modelu, w którym obliczany jest czas trwania na piksel przeniesiony, a następnie pomnożenie przez liczbę wymaganych ruchów, musi uwzględniać ruchy X i Y w tym samym czasie, ponieważ 1 piksel jest rzeczywiście przekątną większa odległość niż 1 piksel w lewo i w prawo, (pierwiastek kwadratowy z 2 na 1) przy założeniu, że same piksele są w rzeczywistości kwadratowe. – user282172

Odpowiedz

13

@Noah Witherspoon jest poprawna powyżej - użyj Pythagorus do uzyskania gładkiej prędkość:

//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

Jako rozszerzenie do @AndyOS „s odpowiedź, jeśli masz zamiar poruszać się tylko wzdłuż one axis (X na przykład) można uprościć matematyki w ten sposób zamiast:

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

Korzystanie Swift 2.x mam rozwiązany z tego małego metody:

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 
} 

Dzięki tej metodzie mogę użyć myShipSpeed ​​Ivar i bezpośrednio zadzwonić moje działania na przykład:

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