删除child个SKSpriteNode

Delete child SKSpriteNode

基本上,我试图做到这一点,以便当用户击中油箱时,旧油箱会消失,而新油箱会在随机位置产生。现在它正在检测碰撞,但我无法摆脱 child。它只会添加一个新油箱,而不会去除旧油箱。

如何删除旧的 child 并生成新的? removefromparent 和 removeallchildren 不工作(nslog 显示 "move" 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
        }

    }
}

您似乎没有提到 "old" 油箱。您所有的例程都在创建一个新的燃料精灵并将其作为 child.

添加到 "self"

您需要获取对 old 燃料精灵的引用并移除 that。在您的代码中,[fuel removeFromParent] 指的是您刚刚在上面的代码中创建的新燃料精灵,而不是您要移除的旧燃料箱。

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

以下是一些观察结果:

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

如果你正在创建一个对象,在你的例子中是一个 SKSpriteNode,并且想稍后删除它,你将需要保留对它的某种引用。有几种方法可以实现,包括创建 属性 或将对象添加到数组。

您的 IF 语句在其当前位置没有任何意义。您的代码正在创建 SKSpriteNode,但您的 IF 语句仅在 FuelGen == 1 时才发布该节点。如果不是,它会尝试删除该节点,该节点本身应该会引发错误,因为您尚未添加它。

最后,当您使用 IF - ELSE IF 语句时,您应该在末尾有一个 ELSE 以捕获未触发任何先前 IF 语句的任何其他内容。


要创建一个 SKSpriteNode 属性 在您的导入和@implementation 之间添加此代码。

@property (nonatomic, strong) SKSpriteNode *mySprite;

现在你有 属性.

要使用 NSMutableArray,您需要将数组设为 属性,然后执行如下操作:

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

现在您已经创建了一个 sprite 并添加到您的数组中并引用了它。