删除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 并添加到您的数组中并引用了它。
基本上,我试图做到这一点,以便当用户击中油箱时,旧油箱会消失,而新油箱会在随机位置产生。现在它正在检测碰撞,但我无法摆脱 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 并添加到您的数组中并引用了它。