2013-10-03 13 views
19

Sto sviluppando un gioco iOS7 con la nuova API denominata Sprite Kit. Mi piacerebbe ruotare orizzontalmente un'immagine/trama SKSpriteNode. L'ho provato dapprima specchiando l'immagine, quindi creando una SKTexture e infine applicandola a SKSpriteNode ma non funziona. C'è un modo per farlo? O dovrei avere immagini diverse?Specchiare orizzontalmente una trama SKSpriteNode

risposta

19

È possibile utilizzare questo codice per capovolgere tra asse x:

spriteNode.xScale = spriteNode.xScale * -1; 

ma attenzione si può perdere alcune delle proprietà di physicsbody, consiglio vivamente u per usare xScale in questo modo:

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

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

E ora si può tranquillamente utilizzare:

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

Questo non disabilita il dosaggio dello sprite? – Zmey

34

Se si sta solo cercando di capovolgere lo sprite lungo un asse, si può fare qualcosa di simile:

sprite.xScale = -1.0; 
+1

Questo non funziona se si hanno figli aggiunti al nodo, anch'essi vengono specchiati. Quindi, se hai cose come le etichette di testo o hitpoint, anche queste vengono riflesse. –

+2

Inoltre, non sembra funzionare se si modifica il punto di ancoraggio. Un modo per fare entrambe le cose? – Gujamin

+2

@Greg facendo questo xScale = -1.0 fa cadere il mio SKSpriteNode attraverso il terreno (prima di ridimensionarlo normalmente si trovava sul terreno). qualche idea perché? (7.1) – Zephyer

0

Io lo uso per il mio sprite destrimano o mancino:

con qualche aiuto da qui 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"]; 
} 

Si può fare lo stesso per i frame di animazione allo stesso modo . Opere per iOS o OS X.

+0

Quindi basta impostare la fisica come normale. – rezwits

0

Questa è la mia soluzione scritto in 2.x Swift, di solito mi prefeer di utilizzare la modalità landscape per i miei giochi, quindi scrivo questa estensione:

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) 
    } 
} 

Usage :

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

PS: Se si desidera che la stessa funzione, ma al modo portrait prega Arbitro a questo answer