如何旋转具有SKEffectNode子项的SKNode

时间:2014-03-31 13:58:40

标签: ios rotation sprite-kit skeffectnode

我想要用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来缩放,但没有旋转。

Here is the starting image 这是起始图像

and after some rotation 并经过一些轮换

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

我知道我可以改变shape2节点的颜色来解决这个特殊问题,但我仍然想了解未来发生的事情。

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

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

0 个答案:

没有答案