2015-06-15 137 views
1

基本上我试图让用户点击一个油箱时,旧坦克消失,并在随机位置产生一个新坦克。现在它正在检测碰撞,但我无法摆脱这个孩子。它只会添加一个新的油箱,而不会摆脱旧的油箱。删除孩子SKSpriteNode

我能做些什么来移除旧的孩子并产生一个新的孩子? removefromparent和removeallchildren不工作(的NSLog显示“移动” S我肯定要实现这个声明检测到碰撞后)

- (void) fuelGenerate { 
    //make a fuel tank 

    for (int j=1; j<2; j++) { 
     SKSpriteNode *fuel = [SKSpriteNode spriteNodeWithImageNamed:@"fuel.png"]; 

     fuel.position = CGPointMake(arc4random_uniform(self.frame.size.width), arc4random_uniform(self.frame.size.height)); 
     [fuel setScale:0.6]; 
     fuel.zPosition = 1; 
     fuel.shadowCastBitMask = 1; 

     fuel.name = @"fuelNode"; 
     fuel.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:fuel.frame.size]; 

     fuel.physicsBody.dynamic = FALSE; 

     fuel.physicsBody.affectedByGravity = false; 
     fuel.physicsBody.usesPreciseCollisionDetection = YES; 
     fuel.physicsBody.categoryBitMask = fuelCategory; 

     fuel.physicsBody.collisionBitMask = fuelCategory | fireCategory; 
     fuel.physicsBody.contactTestBitMask = fireCategory; 


     if (FuelGen == 1) { 

      [self addChild:fuel]; 

     } else if (FuelGen == 0) { 

      NSLog(@"Move"); 

      [fuel removeFromParent]; 
      [self addChild:fuel]; 
      FuelGen == 1 
     } 

    } 
} 
+1

您的代码存在一些逻辑问题,但在开始之前,什么是FuelGen? – sangony

+0

只是一个系统来确定是否应该生成一个燃料罐等等。它工作正常。我只是在删除旧的孩子方面遇到了问题。 –

回答

1

这里有一些意见:

你的代码只在一个循环中运行一次。你为什么这样做?

如果你正在创建一个对象,在你的情况一个SKSpriteNode,并希望稍后删除它,你将需要保留一些对它的引用。有几种做法,包括创建属性或将对象添加到数组。

您在当前位置的IF声明没有任何意义。您的代码正在创建SKSpriteNode,但您的IF语句只在FuelGen == 1时广告节点。如果它不尝试删除本身应该抛出错误的节点,因为您尚未添加该节点。

最后,当您使用IF-ELSE IF语句时,您应该在末尾有一个ELSE来捕捉其他任何不会触发任何以前的IF语句的东西。


要创建SKSpriteNode属性,请在导入(s)和@implementation之间添加此代码。

@property (nonatomic, strong) SKSpriteNode *mySprite; 

现在你有一个属性。

要使用的NSMutableArray你会做让数组的属性,然后做这样的事情:

SKSpriteNode *myNode = [SKSpriteNode spriteWith.... 
myNode.name = @"SomeUniqueName"; 
[self addChild:myNode]; 
[myArray addObject:myNode]; 

现在你已经创建了一个精灵并添加到您的阵列,并有对它的引用。

+0

所有这些变量都已在其他方法中处理完毕。 –

+0

我该怎么做“有几种做法,包括创建一个属性或将对象添加到数组中。” –

+0

@JamesCallyway - 更新 – sangony

0

你似乎并不有“老”油箱的参考。你所做的一切都是创造一个新的燃料精灵,并把它作为一个孩子加入到“自我”中。

您需要获得对燃料精灵的参考,并删除。在你的代码中,[fuel removeFromParent]指的是你刚刚在上面的代码中创建的新燃料精灵,而不是你想要移除的旧燃料箱。

你这样做的方式取决于你的实际执行;例如,如果你只有一个油箱,你可以保留一个参考。如果你有很多,那么需要一个更复杂的系统,比如把它们存储在一个数组中,或者设置你的消息传递以将燃料节点传递给你的代码。但无论哪种方式,除非您在代码中提及它,否则您将永远无法移除旧的燃料节点。

+0

我该如何只参考一个油箱?我宁愿移动我拥有的那个? –

+0

简单的事情就是只需要一个实例变量指向你的一个油箱。在设置场景时创建一次,然后继续参考它。然后,当您收到表明它已被击中的事件时,只需将坦克的位置设置到您希望它位于新位置的位置即可。在下一个更新周期中,它将被绘制在新的位置。 (如果你不明白如何做到这一点,你可能会考虑在网上进行一些小小的学习,然后再用你的游戏进行太多的研究 - 你的腰带上还会有更多的技术支付巨大的红利。) –

+0

更有可能的是,最终会想要更复杂的解决方案。例如,您可能希望旧油箱爆炸或在新油箱“介绍”到现场时进行其他“外部”动画。或者你可能想要一个拥有多个坦克的等级。更好的解决方案是编写代码的方式不会假定只有一个燃料箱,但如果这是您的第一个项目,并且您可以只使用一个“传送”单个框架,只要保留对单个坦克的参考即可。 –