Подтвердить что ты не робот

Горизонтальное зеркало текстуры SKSpriteNode

Я разрабатываю игру iOS7 с новым API под названием Sprite Kit. Я хотел бы горизонтально повернуть изображение/текстуру SKSpriteNode. Я попробовал это, сначала зеркалируя изображение, затем создав SKTexture и, наконец, применив его к SKSpriteNode, но он не работает. Есть ли способ сделать это? Или мне нужно иметь разные изображения?

4b9b3361

Ответ 1

Вы можете использовать этот код для переключения между осью 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

Если вы просто пытаетесь перевернуть спрайт вдоль оси, вы можете сделать что-то вроде этого:

sprite.xScale = -1.0;

Ответ 3

Я использую это для спрайтов rightHanded или leftHanded:

с некоторой помощью отсюда Горизонтальное отражение кадра в 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.

Ответ 4

Это мое решение, написанное в 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, пожалуйста, напишите ответ