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
- 1. Ein Bild horizontal spiegeln
- 2. Spiegeln der TextView horizontal
- 3. Horizontal spiegeln html und css
- 4. Spiegeln/Spiegeln eines Bildes horizontal + vertikal mit CSS
- 5. Ein Hintergrundbild mit css horizontal spiegeln
- 6. Vertikal/Horizontal ein 2d-Array spiegeln
- 7. LIBGDX: Wie kann man eine Kameraansicht horizontal/vertikal spiegeln?
- 8. Flatindexed 2D Array - Spiegeln eines Bildes vertikal/horizontal
- 9. Bild horizontal mit Tween-Animation spiegeln. Nein 3D
- 10. Subviews über eine Hauptansicht spiegeln
- 11. Jquery: Eine Texteingabe in eine andere spiegeln
- 12. Amazon S3 Porträtbild im Browser spiegeln?
- 13. Wie können Sie eine UIBarButtonItem-Animation spiegeln?
- 14. Flip ein Pixel-Array horizontal
- 15. Bits in Python spiegeln
- 16. Spiegeln von Ordnern
- 17. ThreeJS-Geometrie spiegeln
- 18. Bild Spiegeln in WPF
- 19. Einen Binärbaum rekursiv spiegeln
- 20. Symbol spiegeln Hover
- 21. Wie horizontal Webcam Video in Matlab Flip?
- 22. Spiegeln SpriteKit-Knoten, der Kinder pinned hat
- 23. iPhone-Karte wie Spiegeln Animation
- 24. QTreeWidget zum Spiegeln python Wörterbuch
- 25. NSImage auf beiden Achsen spiegeln
- 26. Automatisches Spiegeln eines Git-Repositorys
- 27. Navigationsleiste ausblenden auf Seite spiegeln
- 28. MySQL boolean - Spiegeln des Wertes?
- 29. Spiegeln eines div nach Klassennamen
- 30. Wie Bild horizontal und vertikal mit PHP
Würde das Sprite-Batching nicht deaktiviert? – Zmey