2016-03-14 115 views
1

我試圖讓一個精靈閃爍白色,就像它受到傷害時一樣。這將涉及通過SKAction控制某些參數。首先,我嘗試將SKCropNode與SKShapeNode結合使用,但我不認爲我完全理解它是如何工作的,因爲它沒有做任何事情。我的第二次嘗試是爲精靈着色,但我發現當你將一個精靈着色成白色時,它會顯示它的原始顏色。我確定着色器可以工作,但我沒有太多經驗。有任何想法嗎?使一個SKSpriteNode閃白色

[編輯]

好,對這個話題讀一百萬以上的網站後,我碰到下面的SO question,其中說,SKCropNodes只有SKSpriteNodes工作(掩蔽等)來了。所以我更新了代碼並允許我的精靈變成白色。我認爲我可以運行一個SKAction來關閉白色SKSpriteNode上的alpha來顯示掩蔽節點,但這隻會讓整個sprite消失。所以我想也許我可以將原始圖像添加到SKCropNode,但是然後白色SKSpriteNode消失。我決定創建一個SKAction來調暗白色SKSpriteNode,然後將原始節點添加到SKCropNode。它有效,但有沒有更好的方法?

SKSpriteNode *prod = [SKSpriteNode spriteNodeWithImageNamed:@"some image"]; 
[prod setSize:CGSizeMake(prod.frame.size.width*0.2, prod.frame.size.height*0.2)]; 
prod.zPosition = -1; 

SKSpriteNode *mask = [SKSpriteNode spriteNodeWithImageNamed:@"some image"]; 
[mask setSize:CGSizeMake(mask.frame.size.width*0.2, mask.frame.size.height*0.2)]; 
mask.zPosition = 1; 
//mask.position = CGPointMake(300, 300); 

SKSpriteNode *shape = [SKSpriteNode spriteNodeWithColor:[NSColor whiteColor] size:CGSizeMake(800, 600)]; 
shape.zPosition = 2; 

SKCropNode *cropNode = [SKCropNode node]; 
cropNode.maskNode = mask; 

[cropNode addChild:shape]; 
//[cropNode addChild:prod]; 
cropNode.position = CGPointMake(300, 300); 
[self addChild:cropNode]; 

SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:0.1]; 
[shape runAction:fadeOut completion:^{ 
    [cropNode addChild:prod]; 
}]; 
+0

彩色化色彩的動作不會幫助這裏因爲事實是如何工作的混合:http://stackoverflow.com/q/20715177/3402095嘗試撥打命中狀態圖像(c完全白色的圖像)。這將是最簡單的解決方案。然後在一定的延遲之後交換紋理。或者,如果您需要動畫,請使用兩個精靈並快速淡入/跳出撞擊狀態紋理... – Whirlwind

+0

有沒有辦法用SKCropNode做到這一點?這將是理想的,這樣我就不必爲每個精靈有兩個不同的版本。 – 02fentym

+0

不能說什麼是高性能或優雅的解決方案,但它可能是可行的。如果你更新你的問題到目前爲止你已經嘗試過,可能有人可以幫助... – Whirlwind

回答

2

我想通了。這裏是我寫的處理這個類的重要部分...忽略類的名稱...這是我的應用程序特定的東西,只需要調用它,無論你需要它被稱爲:

VersusImage.h

#import <SpriteKit/SpriteKit.h> 

@interface VersusImage : SKSpriteNode 


-(instancetype) initWithImage:(SKSpriteNode*)image; 
-(void) flashWhite; 

@end 

VersusImage.m

#import "VersusImage.h" 

@interface VersusImage() 

@property SKCropNode *cropNode; 
@property SKSpriteNode *image; 
@property SKSpriteNode *shape; 

@end 

@implementation VersusImage 

-(instancetype) initWithImage:(SKSpriteNode*)image { 
    if (self = [super init]) { 
     _image = image; 
     [self initImage]; 
    } 
    return self; 
} 

-(void) initImage { 
    _image.zPosition = -1; 
    _image.alpha = 1; 

    float width = _image.frame.size.width, height = _image.frame.size.height; 
    SKTexture *texture = [_image texture]; 
    SKSpriteNode *mask = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(width, height)]; 
    mask.zPosition = 1; 

    _shape = [SKSpriteNode spriteNodeWithColor:[NSColor whiteColor] size:CGSizeMake(width, height)]; 
    _shape.zPosition = 2; 
    _shape.alpha = 0; 


    _cropNode = [SKCropNode node]; 
    _cropNode.maskNode = mask; 
    [_cropNode addChild:_shape]; 
    [_cropNode addChild:_image]; 
    [self addChild:_cropNode]; 
} 

-(void) flashWhite { 
    SKAction *showWhite = [SKAction fadeAlphaTo:1.0 duration:0]; 
    SKAction *hideImage = [SKAction fadeAlphaTo:0 duration:0]; 
    SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:0.2]; 
    SKAction *fadeIn = [SKAction fadeAlphaTo:1 duration:0.2]; 

    [_shape runAction:[SKAction sequence:@[showWhite, fadeOut]]]; 
    [_image runAction:[SKAction sequence:@[hideImage, fadeIn]]]; 
} 

@end