2014-01-16 48 views
2

我有一個適用於Mac的精靈套件遊戲,其中有多個精靈節點在屏幕上移動。我該如何做到這一點,我可以removeFromParent某個節點? 例如,我有一個循環定期增加新的節點每秒:如何刪除或獲取SpriteKit中某個節點的位置?

-(void)spawnNew { 
xPos = 100; 
yPos = 1000; 
CGPoint location = CGPointMake(xPos, yPos); 
orb = [SKSpriteNode spriteNodeWithImageNamed:@"orb"]; 
orb.position = location; 
orb.scale = 0.3; 
orb.name = @"orbSprite"; 
CGFloat dirX = 0; 
CGFloat dirY = -30; 
CGVector vector1 = CGVectorMake(dirX, dirY); 
SKAction *action = [SKAction moveBy:vector1 duration:0.1]; 
[orb runAction:[SKAction repeatAction:action count:100000]]; 
[self addChild:orb]; 

} 

我將如何讓這個我可以得到的位置或者刪除某些天體,而不是整個組?例如,如果精靈的位置等於x=100, y=200那麼我會將它從父級移除。目前,如果我嘗試這樣做並檢查球體的位置,它只是檢查最新球體的位置,而不是我想要的所有球體的位置。

謝謝,任何幫助,將不勝感激。

回答

2

這可能不是最有效的答案,但它確實顯示瞭如何做到這一點。請記住,通常使用Sprite Kit,你最終會得到很多節點,因此將它們歸爲父類SKNode是一個好主意,它也允許在樹中指定一個點,以便您可以輕鬆地將它放在下面。 NSLog聲明只是用於測試/調試,我留下了,因爲他們可能會幫助你,如果你嘗試的代碼。

- (void)addOrbs { 
    SKNode *orbRoot = [SKNode node]; 
    [orbRoot setName:@"ORB_ROOT"]; 
    [self addChild:orbRoot]; 

    for(int counter = 0; counter<5; counter++) { 
     SKSpriteNode *newOrb = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(20, 20)]; 
     [newOrb setPosition:CGPointMake(100, 100 + (100*counter))]; 
     NSLog(@"ORB POS: %@", NSStringFromCGPoint([newOrb position])); 
     [newOrb setName:@"orbSprite"]; 
     [orbRoot addChild:newOrb]; 
    } 
} 

- (void)removeOrbAtPoint:(CGPoint)point { 
    SKNode *orbRoot = [self childNodeWithName:@"//ORB_ROOT"]; 
    NSArray *allOrbs = [orbRoot children]; 
    NSLog(@"ORBS: %@", allOrbs); 
    for(SKNode *eachOrb in allOrbs) { 
     if([eachOrb position].x == 100 && [eachOrb position].y == 200) { 
      NSLog(@"REMOVING: %@ WITH POSITION: %@", [eachOrb name], NSStringFromCGPoint([eachOrb position])); 
      [eachOrb removeFromParent]; 
     } 
    } 
} 

使用快速塊枚舉刪除的另一種版本:

- (void)removeOrbAtPoint_v2:(CGPoint)point { 
    SKNode *orbRoot = [self childNodeWithName:@"//ORB_ROOT"]; 
    NSArray *allOrbs = [orbRoot children]; 
    NSLog(@"ORBS: %@", allOrbs); 
    [orbRoot enumerateChildNodesWithName:@"orbSprite" usingBlock:^(SKNode *node, BOOL *stop) { 
     if([node position].x == 100 && [node position].y == 200) { 
      NSLog(@"REMOVING: %@ WITH POSITION: %@", [node name], NSStringFromCGPoint([node position])); 
      [node removeFromParent]; 
     } 
    }]; 
} 
0

循環通過在節點或場景中的所有節點要添加的球體來。

for(SKNode * child in self.children) { 
... 
} 

看看他們是否在這個盒子裏。

for(SKNode * child in self.children) { 
    if(CGRectIntersectsRect(child.calculateAccumulatedFrame, CGRectMake(10, 50, 100, 200))) { 
     ...   
    } 
} 

卸下子(CGRectMake需要的x,y,寬度,高度作爲參數)

for(SKNode * child in self.children) { 
    if(CGRectIntersectsRect(child.calculateAccumulatedFrame, CGRectMake(10, 50, 100, 200))) { 
     [child removeFromParent];  
    } 
} 
1

一種不同的方法 - 可以添加removeFromParent成一個動作序列。這會在它到達一個定義的點時自動刪除它,而不需要額外的代碼。

會將您的moveBy:操作更改爲moveTo:工作嗎?

SKAction *moveToFinish = [SKAction moveTo:finishPoint duration:5.0]; 
SKAction *removeMe = [SKAction removeFromParent]; 
SKAction *actionSeq = [SKAction sequence:@[moveToFinish,removeMe]]; 
[sprite runAction:actionSeq]; 

我的finishPoint是由一個隨機語句產生的,給它一些變化。

相關問題