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
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;
Wenn Sie nur versuchen, das Sprite entlang einer Achse zu drehen, können Sie etwas tun:
sprite.xScale = -1.0;
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. –
Scheint auch nicht zu funktionieren, wenn Sie den Ankerpunkt ändern. Jeder Weg, beides zu tun? – Gujamin
@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
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.
Dann richten Sie einfach Ihre Physik wie normal ein. – rezwits
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
Würde das Sprite-Batching nicht deaktiviert? – Zmey