objective-c swift image ios7 sprite-kit

objective c - Refleja horizontalmente una textura SKSpriteNode



objective-c swift (4)

Esta es mi solución escrita en Swift 2.x , normalmente prefiero usar el modo landscape para mis juegos, así que escribo esta extensión:

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

Uso:

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

PD: si desea la misma función pero en modo portrait , consulte esta answer

Estoy desarrollando un juego iOS7 con la nueva API llamada Sprite Kit. Me gustaría rotar horizontalmente una imagen / textura de SKSpriteNode. Lo probé primero reflejando la imagen, luego creando una SKTexture y finalmente aplicándola al SKSpriteNode pero no funciona. Hay alguna manera de hacer esto? ¿O debería tener diferentes imágenes?


Puedes usar este código para voltear entre el eje x:

spriteNode.xScale = spriteNode.xScale * -1;

pero tenga cuidado de perder algunas de las propiedades de physicsbody, le sugiero encarecidamente que utilice xScale de esta manera:

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

Y ahora puedes usar con seguridad:

spriteNode.xScale = spriteNode.xScale * -1;


Si solo estás tratando de voltear el sprite a lo largo de un eje, puedes hacer algo como esto:

sprite.xScale = -1.0;


Utilizo esto para mis sprites Right-Handed o left-Handed:

con un poco de ayuda desde aquí Horizontal Flip de un marco en 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"]; }

Puedes hacer lo mismo para los cuadros de animación de la misma manera. Funciona para iOS o OS X.