2013-10-08 12 views
7

utilizzando il kit di Sprite Sto cercando di impostare un SKPhysicsBody muoversi secondo un dato angolo, così per esempio se si voleva lo sprite di viaggiare a destra si dovrebbe specificare 1.571 radianti. Per trasformare l'angolo specificato in una velocità, sto usando il metodo qui sotto per convertire i radianti in un CGVector. La versione ORIGINALE che ho implementato dalla memoria ha lo strano effetto di compensare tutti gli angoli di 90 gradi. (Cioè se 0 gradi è usato le mosse sprite destra (proprio come si farebbe se si specificati 90degrees)Conversione angolo radianti a CGVector

. Domanda:

Ho fissato questo nella nuova versione scambiando le assegnazioni dx e dy La mia domanda è perché questo accade, devo sbagliare in originale (non vi sembrano essere altri facendo in questo modo sul web) o c'è qualche motivo in base al particolare sistema di coordinate utilizzato.

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

NOTA: anche nell'orologio del kit Sprite le sagge rotazioni sono negative, finora convertAngleToVector sta facendo rotazioni in senso orario positive (ad es. 1.571 radianti è giusto, dove dovrebbe essere lasciato) Potrei fare solo cos(radians*-1) e sin(radians*-1) ma potrebbe esserci qualche motivo sottostante per questo basato su di me scambiare dx e dy.

Kit Sprite (SKView Coordinate):

enter image description here

risposta

2

Dalla Sprite Kit Programming Guide (enfasi aggiunta): trovi

Sprite Kit anche una convenzione rotazione standard. La Figura 4-2 mostra la convenzione delle coordinate polari. Un angolo di 0 radianti specifica l'asse x positivo. Un angolo positivo è in senso antiorario.

In questo sistema di coordinate, un angolo di radianti pari a zero verso destra è corretto. Se si desidera utilizzare un sistema in cui un angolo zero è diretto (lungo l'asse positivo Y) e aumenta in senso orario, è necessario trasformare i propri angoli prima di convertirli in vettori.

+0

Ah capisco, quindi l'implementazione originale è giusta? – fuzzygoat

3

Sì, SpriteKit è impostato di default a destra. Il progetto di esempio Fisica Collision risolve questo implementando questo metodo:

- (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; 
} 

È quindi possibile solo ottenere l'orientamento esistente chiamando qualcosa come:

CGFloat shipDirection = [self shipOrientation]; 

E quindi regolare la proprietà zRotation da lì.