2013-10-03 16 views
19

Ich entwickle ein iOS7-Spiel mit der neuen API namens Sprite Kit. Ich würde gerne ein SKSpriteNode Bild/Textur horizontal drehen. Ich habe es versucht, indem ich zuerst das Bild gespiegelt habe, dann ein SKTexture erstellt habe und es schließlich auf den SKSpriteNode angewendet habe, aber es funktioniert nicht. Gibt es einen Weg, dies zu tun? Oder sollte ich zu verschiedenen Bildern haben?Eine SKSpriteNode-Textur horizontal spiegeln

Antwort

19

Sie diesen Code verwenden können unter Flip x-Achse:

spriteNode.xScale = spriteNode.xScale * -1; 

aber vorsichtig sein, einige von physicsbody Eigentum verlieren, ich schlage vor, u sehr xScale auf diese Weise zu verwenden:

spriteNodeBody = [SKNode node]; 
spriteNodeBody.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spriteNode.size]; 
spriteNodeBody.physicsBody.categoryBitMask = CNPhysicsCategoryPlayer; 
spriteNodeBody.physicsBody.collisionBitMask = CNPhysicsCategoryBall; 

[spriteNodeBody addChild:spriteNode]; 
[self addChild:spriteNodeBody]; 

Und jetzt können Sie sicher nutzen:

spriteNode.xScale = spriteNode.xScale * -1; 
+0

Würde das Sprite-Batching nicht deaktiviert? – Zmey

34

Wenn Sie nur versuchen, das Sprite entlang einer Achse zu drehen, können Sie etwas tun:

sprite.xScale = -1.0; 
+1

Dies funktioniert nicht, wenn Sie dem Knoten Kinder hinzufügen - diese werden ebenfalls gespiegelt. Also, wenn Sie Zeug wie Text oder Hit Points Labels haben, werden sie auch reflektiert. –

+2

Scheint auch nicht zu funktionieren, wenn Sie den Ankerpunkt ändern. Jeder Weg, beides zu tun? – Gujamin

+2

@Greg macht dies xScale = -1.0 lässt meinen SKSpriteNode durch den Boden fallen (bevor er normal skaliert wurde, stand auf dem Boden). irgendwelche Ideen warum? (7.1) – Zephyer

0

Ich benutze für meine rechtshändigen oder linkshändig Sprites:

mit etwas Hilfe von hier Horizontal Flip of a frame in Objective-C

BOOL leftHanded = YES; 

SKSpriteNode *sprite; 

if (leftHanded) { //my textures point east, so I flip vertically 
    SKTexture *texture = [SKTexture textureWithImageNamed:@"figure-step0"]; 
    CIFilter *filter = [CIFilter filterWithName:@"CIAffineTransform"]; 
    [filter setValue:[CIImage imageWithCGImage:[texture CGImage]] forKey:kCIInputImageKey]; 

#ifdef IOS_BLOCK //set these up with defines 
    CGAffineTransform flipTransform = CGAffineTransformMakeScale(1.0f, -1.0f); // vert 
    [filter setValue:[NSValue valueWithBytes:&flipTransform 
           objCType:@encode(CGAffineTransform)] 
           forKey:@"inputTransform"]; 
#else //OSX_BLOCK 
    NSAffineTransform* flipTransform = [NSAffineTransform transform]; 
    [flipTransform scaleXBy:1.0f yBy: -1.0f]; // vert 
    [filter setValue:flipTransform forKey:@"inputTransform"]; 
#endif 
    sprite = [SKSpriteNode spriteNodeWithTexture: 
        [texture textureByApplyingCIFilter:filter]]; 
} else { 
    sprite = [SKSpriteNode spriteNodeWithImageNamed:@"figure-step0"]; 
} 

Sie können für Animations-Frames das gleiche tun ebenfalls . Arbeitet für iOS oder OS X.

+0

Dann richten Sie einfach Ihre Physik wie normal ein. – rezwits

0

Dies ist meine Lösung in Swift 2.x geschrieben, in der Regel prefeer ich landscape Modus für meine Spiele zu verwenden, so schreibe ich diese Erweiterung:

extension SKTexture { 
    class func flipImage(name:String,flipHoriz:Bool,flipVert:Bool)->SKTexture { 
     if !flipHoriz && !flipVert { 
      return SKTexture.init(imageNamed: name) 
     } 
     let image = UIImage(named:name) 

     UIGraphicsBeginImageContext(image!.size) 
     let context = UIGraphicsGetCurrentContext() 

     if !flipHoriz && flipVert { 
      // Do nothing, X is flipped normally in a Core Graphics Context 
      // but in landscape is inverted so this is Y 
     } else 
     if flipHoriz && !flipVert{ 
      // fix X axis but is inverted so fix Y axis 
      CGContextTranslateCTM(context, 0, image!.size.height) 
      CGContextScaleCTM(context, 1.0, -1.0) 
      // flip Y but is inverted so flip X here 
      CGContextTranslateCTM(context, image!.size.width, 0) 
      CGContextScaleCTM(context, -1.0, 1.0) 
     } else 
     if flipHoriz && flipVert { 
      // flip Y but is inverted so flip X here 
      CGContextTranslateCTM(context, image!.size.width, 0) 
      CGContextScaleCTM(context, -1.0, 1.0) 
     } 

     CGContextDrawImage(context, CGRectMake(0.0, 0.0, image!.size.width, image!.size.height), image!.CGImage) 

     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 
     return SKTexture(image: newImage) 
    } 
} 

Nutzungs :

let spriteTxt = SKTexture.flipImage(imageName, flipHoriz: true, flipVert: false) 

PS: Wenn Sie die gleiche Funktion wollen, aber auf portrait Modus refeer Sie bitte auf diese answer