【问题标题】:Why does SKEmitterNode break accumulatedFrame?为什么 SKEmitterNode 会破坏累积帧?
【发布时间】:2014-07-11 16:44:20
【问题描述】:

我使用以下代码块,在调试时我看到 SKShapeNode 的累积帧现在是 {{-160.03586, -42.431793}, {470.03586, 519.50903}} 而不是 {{0,0}, {100,300}} 之类的东西。

如果我注释掉整个粒子代码,accumulatedFrame 又有意义了。

当我在touchesBegan 中使用nodesAtPoint 时,我需要它有意义。任何无意义的值都会导致nodesAtPoint 也找到不相关的节点,因为现在对所有人来说,accumulatedFrame 都很奇怪,而且它们都相交...

我使用以下代码块,但我无法找出问题所在。我在这里想念什么?

NSString *path = [[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"];
SKEmitterNode *particles = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

particles.position = CGPointMake(_selectedNode.frame.size.width/2, _selectedNode.frame.size.height/2);

[particles runAction:[SKAction sequence:@[[SKAction waitForDuration:.2],
                                        [SKAction fadeAlphaTo:0 duration:0.2],
                                        [SKAction removeFromParent]]] completion:^{
                                [particles removeFromParent];
}];
[_selectedNode addChild:particles];

【问题讨论】:

    标签: ios objective-c sprite-kit sknode skemitternode


    【解决方案1】:

    accumulatedFrame 听起来像,它是包含节点所有图形对象的最小矩形。发射器节点实际上会将节点添加到它添加到的对象中。它在计算累积帧时完全按照预期工作。

    解决这个问题的方法是让发射器节点有一个“目标节点”。 SKEmitterNode 有一个名为 .targetNode 的属性。这基本上意味着它将其精灵放入该节点。

    我发现拥有一个包含我所有发出的节点的 SKNode 是一种很好的方法。然后,这与我单击的图层分开。

    查看 SKEmitterNode 类参考以获取有关 targetNode 的更多信息。

    SKEmitter Node class reference

    【讨论】:

    • 我在[_selectedNode addChild:particles]; 之前添加了particles.targetNode=_selectedNode;,现在它不会破坏accumulatedFrame 的计算,我的touchesBegan 工作正常。但是我仍然对 targetNode=nil 导致计算不正确的原因感到好奇。我对其进行了调试,并且父节点中没有留下children,所以它应该已经正确计算了。你有什么想法吗? targetNode=nil 打破它的父节点的累计帧计算?
    • 我发现,这一次它破坏了其他一些节点,并且 touchesBegan 无法在 Emitter 还活着的时候正确识别被触摸的对象..
    • 目标节点是发射器将放置其粒子的位置。您应该将它们一起添加到不同的图层。我完全远离您的节点分层。 SKEmitterNode 放置在一个节点中,这就是它的位置。但是它的粒子掉落位置是由 targetNode 设置的。
    • _selectedNode 是我希望它链接到的位置,我希望它继续动态地发射具有_selectedNode 相同位置的粒子。 self 是主要场景。这是代码。这感觉不对:SKNode *tNode=[[SKNode alloc]init]; particles.targetNode=tNode; [_selectedNode addChild:particles]; [self addChild:tNode];
    • 将粒子添加到选定的节点。将粒子的targetNode设置为selectedNode的父节点。你在做什么是绝对正确的。添加粒子的位置是它们的起始位置。目标节点是粒子实际产生的地方。
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2011-09-02
    相关资源
    最近更新 更多