从父CCSprite中删除随机对象

时间:2014-06-02 15:12:39

标签: cocos2d-iphone

这可能是一个很难解决的问题,因为我很新。

我有一个场景,服务员拿着一盘食物 (食物是从阵列中选择的随机CCSprite)

每次他上网时,他都会拿着一块新食物 (用户触摸食物,服务员走开以返回
再一次用一块新食物

然而,我似乎无法从屏幕上删除旧的食物 因为它说已经添加了孩子...... 任何帮助都会很棒

 -(id) init
 {
    ///other code then...

    waiterOnSCreen
    = [CCSprite spriteWithSpriteFrameName:@"CatUP.png"];
    waiterOnSCreen.position = ccp(CatOffSCreenPosX, catXpos);
    [self addChild:waiterOnSCreen z:0];

    //moving the waiter
    // the random food sprite is added later to the waiter
    // [waiterOnSCreen addChild:myRandomSprite];
  }


-(void)LoadRandomFood
{
///I make my array here then and add CCSprites
 RandomFood = [[NSMutableArray alloc]initWithObjects:
                              //cake,
                              RandomMuffin,
                              RandomMeat,
                              RandomCake,//
                              nil];//
    int i = 0;
    int count= [RandomFood count];

    if (i < count)
    {


   int i = arc4random() % [RandomFood count];
    myRandomSprite = (CCSprite *)[RandomFood  objectAtIndex:i];

    //waiterOnSCreen is a CCSprite added on the init
    [waiterOnSCreen addChild:myRandomSprite];
    myRandomSprite.position=ccp(290,220);

    myRandomSprite.tag = RandomFoodTag; 
    }
}

        in if(CGRectContainsPoint(waiterOnSCreen.boundingBox, location))
        {
         //trying to remove the food here

         //Ive already tried to remove the sprite using 
         [self removeChildByTag:RandomeObjectTag];

       //and also
        CCSprite *wantedSprite = (CCSprite *)[self getChildByTag:RandomFoodTag];
        [wantedSprite removeFromParentAndCleanup:YES];
        }

        }

我猜它已经崩溃的孩子已经添加了。它不能再次添加&#39; 因为它试图再次添加RandomMuffin,RandomMeat,RandomCake 我不太确定如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

您不需要创建另一个数组来删除精灵。如果您可以提供更完整的项目图片,我将很乐意对其进行审核。你可以将整个代码文件发布到你工作的地方吗?还是多个文件?在进一步检查您的某些示例时,LoadRandomFood中的一些问题是您正在分配NSMutableArray,而不检查RandomFood是否已有值。

这样的事情会更安全,但请注意我在这里做一个完整性检查。在init或其他不经常执行的地方填写RandomFood一次会更有效率。

-(void)LoadRandomFood
{
  if (RandomFood)
  {
    [RandomFood release];
  }

///I make my array here then and add CCSprites
 RandomFood = [[NSMutableArray alloc]initWithObjects:
                              //cake,
                              RandomMuffin,
                              RandomMeat,
                              RandomCake,//
                              nil];//
    int i = 0;
    int count= [RandomFood count];

    if (i < count)
    {


   int i = arc4random() % [RandomFood count];
    myRandomSprite = (CCSprite *)[RandomFood  objectAtIndex:i];

    //waiterOnSCreen is a CCSprite added on the init
    [waiterOnSCreen addChild:myRandomSprite];
    myRandomSprite.position=ccp(290,220);

    myRandomSprite.tag = RandomFoodTag; 
    }
}

如果在添加精灵时发生崩溃,您确定正在执行removeChildByTag调用吗?是否有可能在删除旧标记之前将标记重新分配给新的精灵?你是否介入了调试器中的逻辑?再次,这将有助于查看更完整的代码文件。

答案 1 :(得分:0)

我必须创建另一个数组来访问精灵并将其删除

    NSMutableArray *_buffer = [NSMutableArray new];
   [_buffer insertObject:myRandomSprite atIndex:0];
   CCSprite *sprite = (CCSprite *)[_buffer  objectAtIndex:0];
   [sprite removeFromParentAndCleanup:YES];