我正在使用名为Sprite Kit的新API开发iOS7游戏。我希望能够水平旋转SKSpriteNode图像/纹理。我尝试通过首先镜像图像,然后创建一个SKTexture,并最终将其应用于SKSpriteNode来实现,但是它不起作用。有没有什么方法可以做到这一点?或者我应该有两张不同的图片?
我正在使用名为Sprite Kit的新API开发iOS7游戏。我希望能够水平旋转SKSpriteNode图像/纹理。我尝试通过首先镜像图像,然后创建一个SKTexture,并最终将其应用于SKSpriteNode来实现,但是它不起作用。有没有什么方法可以做到这一点?或者我应该有两张不同的图片?
如果您只是想翻转精灵沿着一个轴,您可以这样做:
sprite.xScale = -1.0;
spriteNode.xScale = spriteNode.xScale * -1;
但是请注意,这样做可能会丢失一些physicsbody的属性。我强烈建议您按照以下方式使用xScale:
spriteNodeBody = [SKNode node];
spriteNodeBody.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spriteNode.size];
spriteNodeBody.physicsBody.categoryBitMask = CNPhysicsCategoryPlayer;
spriteNodeBody.physicsBody.collisionBitMask = CNPhysicsCategoryBall;
[spriteNodeBody addChild:spriteNode];
[self addChild:spriteNodeBody];
现在您可以安全使用:
spriteNode.xScale = spriteNode.xScale * -1;
这是我使用Swift 2.x编写的解决方案,通常我更喜欢在游戏中使用landscape
模式,因此我编写了这个扩展:
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)
}
}
用法:
let spriteTxt = SKTexture.flipImage(imageName, flipHoriz: true, flipVert: false)
附言:如果您想要相同的功能,但是在竖屏
模式下,请参考此答案
我用这个来处理我的右手或左手的精灵:
在这里得到了一些帮助 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"];
}
你同样可以对动画帧执行相同的操作。适用于iOS或OS X。