水平镜像SKSpriteNode纹理

时间:2013-10-03 15:15:02

标签: objective-c swift image ios7 sprite-kit

我正在使用名为Sprite Kit的新API开发iOS7游戏。我想水平旋转SKSpriteNode图像/纹理。我已经尝试过首先镜像图像,然后创建一个SKTexture,最后将它应用到SKSpriteNode,但它不起作用。有办法做到这一点吗?或者我应该有不同的图像?

3 个答案:

答案 0 :(得分:36)

如果你只是试图沿轴转动精灵,你可以这样做:

sprite.xScale = -1.0;

答案 1 :(得分:21)

您可以使用此代码在x轴之间翻转:

spriteNode.xScale = spriteNode.xScale * -1;

但要小心你可能会失去一些物理学家的属性,我强烈建议你以这种方式使用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;

答案 2 :(得分:0)

这是我用 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)

P.S。:如果你想要portrait模式的相同功能,请参考answer