StackBuddy
StackBuddy

Reputation: 577

Removing random object from parent CCSprite

probably this is a simple problem to solve, since I'm quite new.

I have a scene with a waiter holding a tray of food
(the food is a random CCSprite choosen from an array)

each time he comes onscreen he holds a new piece of food
(the user touches the food and the waiter walks off to return
again with a new piece of food

however I cant seem to delete the old peice of food from the screen as it says the child is already added... any help would be great

 -(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; 
    }
}

later

        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];
        }

        }

Im guessing its also crashing 'child already added. It can't be added again' as its trying to add RandomMuffin,RandomMeat,RandomCake, again im not too sure how to fix that.

Upvotes: 0

Views: 68

Answers (2)

Rob Segal
Rob Segal

Reputation: 7625

You shouldn't need to create another array just to delete a sprite. If you can provide a more complete picture of your project I would be happy to review it. Can you post the entire code file where you are doing your work? Or multiple files? On inspecting some of your samples further a few concerns in LoadRandomFood you are allocating an NSMutableArray without checking if RandomFood already has a value.

Something like this would be safer though note I am just doing a sanity check here. It would be more efficient to just fill in RandomFood once on init or elsewhere that is not going to be executed constantly.

-(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; 
    }
}

In the case of the crash when adding a sprite are you sure the removeChildByTag call is being executed? Is it possible you are re-assigning the tag to a new sprite before deleting the old one? Have you stepped through the logic in the debugger? Again it would help to see a more complete code file here.

Upvotes: 1

StackBuddy
StackBuddy

Reputation: 577

I had to make another array to access the sprite and delete it

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

Upvotes: 0

Related Questions