2013-10-08 6 views
7

Verwenden von Sprite Kit Ich versuche, eine SKPhysicsBody Bewegung entsprechend einem bestimmten Winkel einzustellen. Wenn Sie zum Beispiel das Sprite nach rechts bewegen möchten, geben Sie 1.571 Radian an. Um den angegebenen Winkel in eine Geschwindigkeit umzuwandeln, verwende ich die Methode unten, um Radianten in eine CGVector umzuwandeln. Die ORIGINAL-Version, die ich aus dem Speicher implementiert habe, hat den seltsamen Effekt, alle Winkel um 90 Grad zu versetzen. (Dh wenn 0 Grad die Sprite bewegt sich nach rechts verwendet wird (wie es wäre, wenn Sie angegeben 90Grad)Konvertieren des Bogenwinkels in CGVector

. Frage:

ich dies in der neuen Version behoben haben, indem sie die dx und dy Zuweisungen Swapping Meine Frage ist, warum dies geschieht, muss ich es falsch, im Original (es scheinen andere zu sein, dass es so auf dem Netz zu tun) oder ist es aus irgendeinem Grund auf der Grundlage des bestimmten Koordinatensystem verwendet wird.

// ORIGINAL 
- (CGVector)convertAngleToVector:(CGFloat)radians { 
    CGVector vector; 
    vector.dx = cos(radians) * 10; 
    vector.dy = sin(radians) * 10; 
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy); 
    return vector; 
} 


// NEW, SWAPPED DX & DY 
- (CGVector)convertAngleToVector:(CGFloat)radians { 
    CGVector vector; 
    vector.dy = cos(radians) * 10; 
    vector.dx = sin(radians) * 10; 
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy); 
    return vector; 
} 

HINWEIS: auch in Sprite Kit Uhr weise Rotationen sind negativ, so weit convertAngleToVector macht positive im Uhrzeigersinn Umdrehungen (d. h. 1.571 Radian ist richtig, wo es gelassen werden sollte) Ich könnte einfach cos(radians*-1) und sin(radians*-1) tun, aber es könnte einige zugrunde liegenden Grund dafür basierend auf mir Austausch von dx und dy.

Sprite Kit (SKView Koordinaten):

enter image description here

Antwort

2

Vom Sprite Kit Programming Guide (Hervorhebung hinzugefügt):

Sprite Kit hat auch eine Standard-Drehkonvention. Abbildung 4-2 zeigt die Polarkoordinatenkonvention. Ein Winkel von 0 Radianten gibt die positive x-Achse an. Ein positiver Winkel ist im Gegenuhrzeigersinn.

In diesem Koordinatensystem ist ein Winkel von null Radianten, der nach rechts zeigt, korrekt. Wenn Sie ein System verwenden möchten, bei dem der Nullwinkel gerade ist (entlang der positiven y-Achse) und im Uhrzeigersinn zunimmt, sollten Sie Ihre Winkel transformieren, bevor Sie sie in Vektoren umwandeln.

+0

Ah ich sehe, also ist die ursprüngliche Implementierung dann richtig? – fuzzygoat

3

Ja, SpriteKit ist standardmäßig auf der rechten Seite. Das Projekt Physik Kollision Probe löst dieses Problem durch Implementierung dieses Verfahrens:

- (CGFloat)shipOrientation 
{ 
    // The ship art is oriented so that it faces the top of the scene, but Sprite Kit's rotation default is to the right. 
    // This method calculates the ship orientation for use in other calculations. 
    return self.zRotation + M_PI_2; 
} 

Sie können dann bekommen nur die bestehende Ausrichtung durch etwas wie der Aufruf:

CGFloat shipDirection = [self shipOrientation]; 

Und dann von dort den zRotation Eigenschaft einzustellen.