我有一个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
在此节点树中使用 an 并让父级以理智的方式响应 zRotation ?
我的一个想法是问题在于CIFilter
基于存储的 inputImage 的渲染输出,它不会旋转,但我现在真的在猜测。