我想要用SKNode
来组织其他一些SKSpriteNodes
和SKEffectNodes
。最终目标是让一个角色精灵可以改变其身体部分的颜色(因此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
并让父级响应zRotation以理智的方式?
我曾经想过的一个问题是问题在于基于存储的inputImage的CIFilter
渲染输出,它不会被旋转,但我现在正在猜测。