2013-10-07 1 views
0

У меня есть следующие:Каков наилучший подход, чтобы добавить существующие спрайты как ребенок спрайта

  1. Фоновый спрайт называется «_background»
  2. 3 х спрайтов «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, щелкнув весь спрайт.

ответ

0

Вы хотите, чтобы вы могли одновременно перетаскивать все три спрайта и синхронно, их положение относительно друг друга всегда оставалось неизменным?

Что я всегда говорю в таких случаях. Если вы хотите, чтобы несколько спрайтов (или любой узел) делали что-то вместе, добавьте SKNode, поместите в него все три спрайта, перетащите узел. Бам, супер просто!

+0

Я знаю это, но я не хочу использовать Cocos2D, поскольку я использую и изучаю SpriteKit, а затем преобразую все его в KoboldKit вперёд. – PeterK

+0

жаль, что я хотел сказать SKNode не CCNode. Независимо от того, что принцип тот же. – LearnCocos2D

+0

Я знаю это, и ты дал мне этот ответ раньше, но я просто не могу заставить его нормально работать, добавляя контейнер SKNode. Не могли бы вы показать мне в коде правильный путь? – PeterK

0

Теперь я получил его на работу, я сделал очень простую ошибку, поскольку я попытался переместить выбранный узел, а не topNode (контейнер). Невероятно, я должен заметить, что, особенно после того, как Steffens предложение :-(

Благодаря Штеффен & Бен 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); 
} 
}