将现有精灵添加为子精灵的最佳方法是什么



我有以下内容:

  1. 名为"_background"的背景精灵
  2. 3 x 精灵 "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。

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

在这种情况下,我总是说什么。如果你想让多个精灵(或任何节点)一起做某事,那么:添加一个SKNode,把所有三个精灵都放进去,拖动节点。砰,超级简单!

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

感谢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);
}
}

最新更新