2013-11-21 15 views
9

Y-ekseni etrafında bir SKSpriteNode düğümü döndürmeye çalışıyorum. ZRotation özelliği olduğunu biliyorum ve bu, düğümü saat yönünde veya saat yönünün tersine döndürecek; bununla birlikte, düğümü kendi Y ekseni etrafında döndürmek istiyorum (örneğin dans eden bir balerin gibi) ve bunun için herhangi bir işlev göremiyorum. Bunu yapmanın en iyi yolu nedir?Düğümün Y ekseni etrafında bir SKSpriteNode nasıl döndürülür?

+0

Buna animasyon veya 3D denir. 3B çerçevesinde 3D yapamazsınız. –

+0

O ayağa kalkıyor.Açıkçası yukarıdan aşağı bir görünüm olsaydı zRotation işe yarayacaktı. – marina

+1

xScale'i 1,0'dan -1.0'a kadar değiştirmeyi deneyin, 3D döndürme türüne en yakın olanı budur. – LearnCocos2D

cevap

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]; 

Bu 3 boyutlu kart çevirme neye benzediğini alacak ama belli bir nesne alışkanlık ölçeklendirme ile programlama yoluyla olsun derinliği olması bekliyor Eğer.

Ya da iyi daha az animasyonlar (LearnCocos2D önerildiği gibi):

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
Tipik

sizin tarif gibi görünüyor ve iyi bakmak istiyorum gibi bir şey döndürmek isteyen ediyorum, ben sprite çerçeveler aracılığıyla yapacak farklı dönüş derecelerini tasvir eder.

yapabilirsiniz gerçekten sahte o tam tersi 1'den -1 sizin xScale özelliği arasını doldurma ve bir küçük.

xScale hile belki kartları (veya kağıt Mario) için uygulanabilir, ancak balerin için, çok değil. Bir 2D nesnenin 3B dönüşünü arıyorsunuz ve bu, bu yöntemle gerçekleşmeyecek.

Yani xScale hüner ihtiyaçlarınız için uygun değilse, sen peri çerçeveler aracılığıyla idare gerekir.

: Bu animasyonlu gif o y dönüşünü almak için sprite çerçevelerin bir örnektir

enter image description here

: Burada

size arzu rotasyon elde etmesine olanak sağlayacak bir 3d SpriteSheet bir örnek enter image description here

1

SpriteKit tam 2.5D yetenekleri (dönen ve X, Y ve Z eksenleri boyunca dönüştürülmesi) olmamakla birlikte, Mağrası SKSpriteNodes dönen ilgili geçici bir çözüm geliştirdik d ya X ya da Y eksenleri. SKView, UIView'in bir alt sınıfı olduğundan, CATransform3D kullanarak bir UIView döndürdüğümüz gibi, 3B alanda döndürebiliriz.

ana nokta Y ekseninde döndürülebilir gereken peri kendi SKView sunulmuştur kendi sahnesinde, yaşıyor olmasıdır.

y ekseninde (SKScene ve SKSpriteNode ihtiva eden) için SKView animasyon bir döngü içinde aşağıdaki kodu Tetikleme. Ana sahnenin arka planda aynı anda çalışmasını ve y ekseninde animasyon gerektiren spritelar arasında geçiş yapıp animasyon tamamlandığında bunları değiştirebilir ve Y rotasyon sahnesini kaldırabilirsiniz. Bu güzel bir çözüm değil, ancak Apple daha iyi 2.5D yetenekleri ekleyene kadar var. Daha fazla bilgi gerekiyorsa eğer

Ben örnek koduyla SpriteKit üzerinde öğretici ve 2.5D yazdım. 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]; 

Bununla birlikte, hareketli grafik bir kalınlığa sahip gibi görünüyor.