2013-12-16 17 views
11

Ich habe eine kreisförmige Maske erstellt und animiere ein Sprite in der Maske mit dem Sprite Kit SKCropNode Klasse. Der Rand der Maske sieht jedoch pixelig aus.SKCropNode Maskierungskante Anti-Aliasing

Gibt es eine Möglichkeit, Anti-Aliasing zu verwenden, um die Kanten zu glätten?

+0

könnten Sie den Code teilen, den Sie verwendet haben, um die Maske zu erreichen? – ZeMoon

+0

wird nur auf dem Simulator pixelig oder das Gerät auch ?? –

+1

Laut Specs wird es definitiv gezackte Kanten haben, da der SKCropNode einen booleschen (0 oder 1) Alpha-Wert und keinen Byte-Wert (zB 0 bis 255) verwendet. –

Antwort

3

von den offiziellen Dokumenten:

Wenn das Pixel in der Maske einen Alpha-Wert von weniger als 0,05 hat, das Bildpixel wird ausgeblendet.

Also, SKCropNode unterstützt nicht pro Pixel Alpha-Werte. Es zeichnet entweder die Pixel oder nicht. Wenn Ihnen Alpha (wie bei Anti-Aliasing) wichtig ist, sollten Sie alternative Routen in Betracht ziehen. Zum Beispiel:

How to Mask an UIImageView

3

Wenn Sie SKNode/SKSpriteNode mit einem Anti-Aliasing-Effekt verschleiern wollen - können Sie SKEffectNode statt SKCropNode verwenden. Es funktioniert auch mit animierten Knoten. Hier ist ein Beispiel:

// Set up your node 
SKNode *nodeToMask = [SKNode node]; 
// ... 

// Set up the mask node 
SKEffectNode *maskNode = [SKEffectNode node]; 

// Create a filter 
CIImage *maskImage = [[CIImage alloc] initWithCGImage:[UIImage imageNamed:@"your_mask_image"].CGImage]; 
CIFilter *maskFilter = [CIFilter filterWithName:@"CISourceInCompositing" 
            keysAndValues:@"inputBackgroundImage", maskImage, nil]; 
// Set the filter 
maskNode.filter = maskFilter; 

// Add childs 
[maskNode addChild:nodeToMask]; 
[scene addChild:maskNode];