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
È 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;
Se si sta solo cercando di capovolgere lo sprite lungo un asse, si può fare qualcosa di simile:
sprite.xScale = -1.0;
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. –
Inoltre, non sembra funzionare se si modifica il punto di ancoraggio. Un modo per fare entrambe le cose? – Gujamin
@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
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.
Quindi basta impostare la fisica come normale. – rezwits
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
- 1. Dimensionamento e ridimensionamento SKSpriteNode
- 2. Modifica un'immagine SKSpriteNode
- 3. come lanciare SKSpriteNode?
- 4. SKSpriteNode con UIImage dall'URL
- 5. Inserire una trama in miniatura all'interno di una trama
- 6. Come copiare SKSpriteNode con SKPhysicsBody?
- 7. disegna una trama pixelata
- 8. Posizione SkSpriteNode nel gioco universale
- 9. SKSpriteNode viene nascosto sotto il nodo genitore
- 10. ggplot2: ordinamento di una trama
- 11. annotare una trama utilizzando matplotlib
- 12. Cosa legge una trama dipendente?
- 13. OpenGL - Rendering in una trama
- 14. Center a SKLabelNode su un SKSpriteNode
- 15. Custom SKSpriteNode non rilevato durante il tocco
- 16. Come portare un SKSpriteNode in primo piano?
- 17. Come connettere due SKSpriteNode usando SKPhysicsJointPin - swift
- 18. SKSpriteNode, aggiunto/rimosso dal genitore hook
- 19. immagine rapido SKSpriteNode cambiamento nella classe SKScene
- 20. Allinea immagini orizzontalmente CSS
- 21. SeekBar Android capovolta orizzontalmente
- 22. Converti un UIImage in una trama
- 23. Punti trama su una sfera in R
- 24. Come etichettare una trama di contorno Seaborn
- 25. etichettare una trama in incrementi di pi
- 26. Produrre una trama raster in R
- 27. Come fare una trama ridicolmente ampia
- 28. Come si crea una trama verticale numpy?
- 29. Get XLIM da una trama in R
- 30. matplotlib - trama duplicata da una figura all'altra?
Questo non disabilita il dosaggio dello sprite? – Zmey