2013-11-21 8 views
9

Ich versuche, einen SKSpriteNode-Knoten um seine Y-Achse zu drehen. Ich weiß, dass es die Eigenschaft zRotation gibt, die den Knoten im oder gegen den Uhrzeigersinn dreht; Ich möchte jedoch den Knoten um seine eigene Y-Achse rotieren lassen (wie zum Beispiel eine tanzende Ballerina), und ich kann anscheinend keine Funktionalität dafür finden. Was ist der beste Weg, dies zu tun?Wie wird ein SKSpriteNode um die Y-Achse des Knotens gedreht?

+0

Dies nennt man eine Animation oder 3D. Sie können das 3D nicht in einem 2D-Framework erstellen. –

+0

Sie steht auf.offensichtlich, wenn es ein Top-Down-Look wäre, würde die zRotation funktionieren. – marina

+1

Versuchen Sie, xScale von 1,0 auf -1,0 zu ändern, das ist das Ergebnis, das Sie am nächsten bei einer 3D-Rotation finden – LearnCocos2D

Antwort

5
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    sprite.position = location; 
    SKAction* action0 = [SKAction scaleXTo:1.0 duration:0.5]; 
    SKAction* action1 = [SKAction scaleXTo:0.1 duration:0.5]; 
    SKAction* action2 = [SKAction scaleXTo:-0.1 duration:0.5]; 
    SKAction* action3 = [SKAction scaleXTo:-1.0 duration:0.5]; 

    SKAction* action = [SKAction sequence:@[action0, action1, action2, action3]]; 
    [sprite runAction:[SKAction repeatActionForever:action]]; 

    [self addChild:sprite]; 

Diese erhalten Sie, was wie ein Flip-3D-Karte aussieht, aber offensichtlich, wenn Sie ein Objekt erwar Tiefe haben Sie nicht, dass mit Skalierung programmatisch bekommen.

Oder auch weniger Animationen (As LearnCocos2D vorgeschlagen):

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    sprite.position = location; 
    SKAction* action0 = [SKAction scaleXTo:1.0 duration:0.5]; 
    SKAction* action1 = [SKAction scaleXTo:-1.0 duration:0.5]; 

    SKAction* action = [SKAction sequence:@[action0, action1]]; 
    [sprite runAction:[SKAction repeatActionForever:action]]; 

    [self addChild:sprite]; 
6

der Regel etwas, wenn ich will mich drehen, wie Sie zu beschreiben scheinen, und wollen, dass es gut aussehen, werde ich es über Sprite-Frames tun Darstellung verschiedener Rotationsgrade.

Sie können es tatsächlich ein wenig vortäuschen, indem Sie Ihre xScale-Eigenschaft von 1 auf -1 und umgekehrt umwandeln.

Der xScale Trick ist möglich für Karten vielleicht (oder Papier Mario), aber für eine Ballerina, nicht so sehr. Sie suchen nach 3D-Rotation eines 2D-Objekts, und das wird nicht über diese Methode geschehen.

Wenn also der xScale-Trick für Ihre Anforderungen nicht durchführbar ist, müssen Sie ihn über Sprite-Frames behandeln.

Hier ist ein Beispiel von einem 3d SpriteSheet, dass Sie die Drehung, die Sie wünschen, zu erreichen, würde es ermöglichen:

enter image description here

Dieses animierte gif ist ein Beispiel für Sprite-Frames, dass y Rotation zu erhalten:

enter image description here

1

Obwohl SpriteKit nicht über volle 2.5D-Fähigkeiten verfügt (rotierend und transformierend entlang der X-, Y- und Z-Achse), habe ich ein Workaround für rotierende SKSpriteNodes aroun entwickelt d entweder die X- oder die Y-Achse. Da SKView eine Unterklasse von UIView ist, können wir es im 3D-Raum genauso drehen, wie wir eine UIView mit CATransform3D drehen.

Der Hauptpunkt ist, dass das Sprite, das auf der Y-Achse gedreht werden muss, in einer eigenen Szene lebt, die in einem eigenen SKView dargestellt wird.

Wenn Sie den folgenden Code in einer Schleife aktivieren, wird Ihr SKView (mit dem SKScene und dem SKSpriteNode) auf der Y-Achse animiert. Sie können Ihre Hauptszene immer noch gleichzeitig im Hintergrund laufen lassen und die Sprites, die auf der Y-Achse animiert werden müssen, austauschen und sie dann austauschen, wenn die Animation abgeschlossen ist, und Y-Rotationsszene entfernen. Es ist keine schöne Lösung, aber es ist alles da, bis Apple bessere 2.5D-Fähigkeiten hinzufügt.

Ich habe ein Tutorial auf SpriteKit und 2.5D mit Beispielcode geschrieben, wenn Sie weitere Informationen benötigen. http://www.sdkboy.com/?p=283

self.rotAngle -= 10; 

float angle = (M_PI/180.0f) * self.rotAngle/10; 

CATransform3D transform3DRotation = CATransform3DMakeRotation(1.0, angle, 0.0, 0.0); 

self.mySKView.layer.transform = transform3DRotation; 
2
SpriteNode *spriteNode = [SKSpriteNode [email protected]"Sprite"]; 
spriteNode.position = position; 

SKAction *action = [SKAction repeatActionForever:[SKAction customActionWithDuration:duration actionBlock:^(SKNode *node, CGFloat elapsedTime) { 
    node.xScale = sin(2 * M_PI * elapsedTime/duration); 
}]]; 

[self addChild:spriteNode]; 

Allerdings sieht das Sprite wie keine Dicke aufweist.