1

我有一个SKNode我想用它来组织一些其他的SKSpriteNodesSKEffectNodes. 最终目标是让角色精灵可以改变其身体部分的颜色(因此SKEffectNode)以及许多其他行为(因此将它们全部添加到父级SKNode

SKNode出于组织和学习的原因,我想组织复杂和复合的行为。

这是我的代码:

@interface TestNode : SKNode

-(void)rotate;
- (instancetype)initWithPosition:(CGPoint)position;

@end

@implementation TestNode {
    SKSpriteNode *_shape1;
    SKSpriteNode *_shape2;
    CIFilter *_hueFilter;
    SKEffectNode *_effectNode;
}

- (instancetype)initWithPosition:(CGPoint)position;
{

    /* Setup your scene here */
    self.position = position;
    self.name = @"compoundNode";

    _shape1 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(80, 30)];
    [self addChild:_shape1];

    _shape2 = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(20, 50)];

    BOOL useEffectNode = YES;
    if (useEffectNode) {
        _effectNode = [SKEffectNode node];
        [_effectNode addChild:_shape2];

        _hueFilter = [CIFilter filterWithName:@"CIHueAdjust"];
        [_hueFilter setValue:@0 forKey:@"inputAngle"];
        _effectNode.filter = _hueFilter;
        _effectNode.shouldEnableEffects = YES;
        [self addChild:_effectNode];
    } else {
        [self addChild:_shape2];
    }
    return self;
}

-(void) rotate {
    float angle = self.zRotation;
    angle = angle + 0.1;
    [self runAction:[SKAction rotateToAngle:angle duration:0.1]];
    [self updateColor];
}

-(void) updateColor {
    float randVal = RandomRange(0, 6.14);
    [_hueFilter setValue:[NSNumber numberWithFloat:randVal] forKey:@"inputAngle"];
}

@end

当它运行并调用旋转方法时(例如从场景中的 touchesBegan 调用),红色 shape1 按预期旋转,但绿色 shape2 有点疯狂。看起来,它似乎是先通过 X 再通过 Y 缩放,但没有旋转。

这是起始图像 这是起始图像

并经过一些旋转 并经过一些旋转

我已经尝试记录所有节点的 zRotation,父节点已更新,所有子节点都保持在 0.0。这是我所期望的。

我知道我可以更改 shape2 节点的颜色来解决这个特定问题,但我仍然想了解未来会发生什么。

我知道,当我SKEffectNode从等式中取出时,一切都按预期工作,所以我的问题是如何SKEffectNode在此节点树中使用 an 并让父级以理智的方式响应 zRotation ?

我的一个想法是问题在于CIFilter基于存储的 inputImage 的渲染输出,它不会旋转,但我现在真的在猜测。

4

0 回答 0