【问题标题】:What is the best approach to add existing sprites as child sprite's将现有精灵添加为子精灵的最佳方法是什么
【发布时间】:2026-02-05 11:25:02
【问题描述】:

我有以下:

  1. 名为“_background”的背景精灵
  2. 3 x sprite "C4"、D5" 和 "Hj"

三个精灵分别添加到背景上。然后,我希望通过双击将它们同时拖动到屏幕上的另一个位置,同时它们保持相同的顺序和位置。

我得到它的唯一方法,几乎​​,是使用这段代码:

- (void)tap2TouchesGesture:(UITapGestureRecognizer *)sender {
SKNode *removeNode = [_background childNodeWithName:@"C4"];
CGPoint aPos = removeNode.position;
[removeNode removeFromParent];


SKSpriteNode *topNode = [SKSpriteNode spriteNodeWithImageNamed:@"C4"];
topNode.position = aPos;
topNode.zPosition = 100;
topNode.name = @"C4";
[_background addChild:topNode];

removeNode = [_background childNodeWithName:@"D5"];
[removeNode removeFromParent];


SKSpriteNode *vv = [SKSpriteNode spriteNodeWithImageNamed:@"D5"];
vv.position = CGPointMake(-10, -10);
vv.zPosition = -10;
vv.userInteractionEnabled = NO; // just testing
vv.name = @"D5";
[topNode addChild:vv];

removeNode = [_background childNodeWithName:@"Hj"];
[removeNode removeFromParent];
vv = [SKSpriteNode spriteNodeWithImageNamed:@"Hj"];
vv.position = CGPointMake(-20, -20);
vv.zPosition = -50;
vv.userInteractionEnabled = NO; // just testing
vv.name = @"Hj";
[topNode addChild:vv];
}

处理完上述代码后,我可以移动精灵包,但当前的问题是父级 C4 似乎不在顶部。选择 C4 的唯一方法是单击任何其他精灵之外的部分,不包括 _background。

我猜这不是执行此操作的最佳方法,因此我想寻求一些有关如何正确执行此操作的帮助。另外,我可以通过单击整个精灵来选择 C4。

【问题讨论】:

    标签: parent-child sprite-kit


    【解决方案1】:

    您的意思是您希望能够同时同步拖动所有三个精灵,它们相对于彼此的位置始终保持不变?

    在这种情况下我总是说什么。如果您希望多个精灵(或任何节点)一起做某事,那么:添加一个 SKNode,将所有三个精灵放入其中,拖动节点。 Bam,超级简单!

    【讨论】:

    • 我知道,但我不想使用 Cocos2D,因为我使用并学习 SpriteKit,然后将其全部转换为 KoboldKit。
    • 对不起,我的意思是说 SKNode 不是 CCNode。不管原理是一样的。
    • 我知道,您之前确实给过我这个答案,但我只是无法让它正常工作,添加一个 SKNode 容器。您能否以正确的方式显示代码?
    【解决方案2】:

    我现在让它工作了,我犯了一个非常简单的错误,因为我试图移动选定的节点而不是 topNode(容器)。难以置信,我应该已经看到了,尤其是在 Steffens 的建议之后:-(

    感谢 Steffen 和 Ben Stahl @ Apple SpriteKit 论坛:-)

    但是,这是我用于此示例的代码:

    - (void)tap2TouchesGesture:(UITapGestureRecognizer *)sender {
    
    _topNode = [SKNode node];
    [_background addChild:_topNode];
    
    
    SKSpriteNode *vv = [SKSpriteNode spriteNodeWithImageNamed:@"C4"];
    [_topNode addChild:vv];
    
    vv = [SKSpriteNode spriteNodeWithImageNamed:@"D5"];
    [_topNode addChild:vv];
    
    vv = [SKSpriteNode spriteNodeWithImageNamed:@"Hj"];
    [_topNode addChild:vv];
    
    _isThePackSelectedForAction = YES; // sprites are selected
    
    }
    
    
    - (void)handlePan:(UIPanGestureRecognizer *)sender {
    
    _currentTouchLocationGlobal = [sender locationInView:sender.view];
    _currentTouchLocationGlobal = [self convertPointFromView:_currentTouchLocationGlobal];
    
    
    if (_isThePackSelectedForAction) {
        _topNode.position = CGPointMake(_currentTouchLocationGlobal.x, _currentTouchLocationGlobal.y);
    } else {
        _currentNode.position = CGPointMake(_currentTouchLocationGlobal.x, _currentTouchLocationGlobal.y);
    }
    }
    

    【讨论】:

      最近更新 更多