Objective c 使用alpha对PNG图像进行SKBlendModeMultiply

Objective c 使用alpha对PNG图像进行SKBlendModeMultiply,objective-c,sprite-kit,Objective C,Sprite Kit,我对SpriteKit有意见。我有一个.png,它是我的角色的阴影,是一个SKSpriteNode图像。当我将模式设置为SKBlendModeMultiply时,它将图像中的alpha视为黑色,使整个图像成为黑色正方形 有人知道如何解决这个问题吗?甚至当你同时将SKEmitterNode中的粒子设置为SKBlendNodeMultiply时,这种情况似乎也会发生。你遇到的问题是,如果你使用的图像带有内置alpha(如下面的苹果太空船或我的UFO),你就没有使用正确的混合模式您不需要将混合模式指定

我对SpriteKit有意见。我有一个
.png
,它是我的角色的阴影,是一个
SKSpriteNode
图像。当我将模式设置为
SKBlendModeMultiply
时,它将图像中的alpha视为黑色,使整个图像成为黑色正方形


有人知道如何解决这个问题吗?甚至当你同时将
SKEmitterNode
中的粒子设置为
SKBlendNodeMultiply
时,这种情况似乎也会发生。

你遇到的问题是,如果你使用的图像带有内置alpha(如下面的苹果太空船或我的UFO),你就没有使用正确的混合模式您不需要将混合模式指定为
[sprite setBlendMode:SKBlendModeAlpha]的默认值对于嵌入alpha的图像是正确的

使用的图像

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        self.backgroundColor = [SKColor redColor];
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];
        SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"TEST_0001"];
        //[sprite setBlendMode:SKBlendModeAlpha]; // Default value

        sprite.position = location;
        SKAction *action = [SKAction rotateByAngle:M_PI duration:1];
        [sprite runAction:[SKAction repeatActionForever:action]];
        [self addChild:sprite];
    }
}

尝试删除行[sprite setBlendMode:SKBlendModeMultiply];在您的代码中,或将其替换为[sprite setBlendMode:SKBlendModeAlpha];以获得正确的结果。这是我使用的代码

使用的代码

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        self.backgroundColor = [SKColor redColor];
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];
        SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"TEST_0001"];
        //[sprite setBlendMode:SKBlendModeAlpha]; // Default value

        sprite.position = location;
        SKAction *action = [SKAction rotateByAngle:M_PI duration:1];
        [sprite runAction:[SKAction repeatActionForever:action]];
        [self addChild:sprite];
    }
}
以及模拟机显示comp的屏幕梯度

模拟器


您是否检查了alpha是否正确,我一直在使用alpha图像(在MODO中渲染),没有任何问题。你能发布一个你正在使用但不起作用的图像吗?请发布你正在使用的代码和一个指向你正在使用的图像的链接。否则,我们无法帮助您诊断问题,因为这里没有足够的信息。一个非常快速的测试方法是创建一个新的Sprite工具包项目。我所做的只是在SKSpriteNode*sprite=[SKSpriteNode SpriteNode spriteNodeWithImageNamed:@“Spaceship”之后加上一行:“[sprite setBlendMode:SKBlendModeMultiply]”;这是整个方法的图片:这是我得到的结果图片,我将背景颜色改为白色,以更好地显示问题