Удаление спрайта в Cocos2d, вызывающее сбой - PullRequest
1 голос
/ 31 марта 2011

У меня есть метод, настроенный для удаления спрайта при касании, у меня есть несколько спрайтов, которые нужно удалить, но я показываю только один ниже:

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 

    ....

    if(CGRectContainsPoint(goalItem.boundingBox, touch)) {
          [self removeChild:goalItem cleanup:YES];
    }

    ....

}

Где goalItem это CCSprite, объявленный в заголовке.В основном это вызывает сбой после повторного вызова метода ccTouchEnded .

Я предполагаю, что это потому, что метод ищет goalItem , когда он уже удален, но яя не уверен.

Каков наилучший способ безопасного удаления спрайта и предотвращения путаницы с указателем?

Я очень новичок в cocos2d и target-c, так чтоЯ уверен, что это, вероятно, довольно фундаментальная ошибка: /

ОБНОВЛЕНИЕ:

Я исправил это, создав этот метод:

-(BOOL)checkForGoalSprite:(CGPoint)point {
if([self.children containsObject:goalItem]){
    if(CGRectContainsPoint(goalItem.boundingBox, point)){
        return YES; 
    }else {
        return NO;
    }
}else{
    return NO;  
}      

}

Так что ccTouchEnded читает:

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 

....

if([self checkForGoalSprite:touch]) {
      [self removeChild:goalItem cleanup:YES];
}

....

}

Я уверен, что есть лучший способ ...

ОБНОВЛЕНИЕ:

Я делал основныеошибка использования if else операторов, где я мог бы использовать if операторов, заставляя ccTouchEnded выбрать только один вариант.

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Вы «очищаете» спрайт, поэтому после этой точки указатель может оказаться мусором.Я делаю это, проверяя объект CCSprite на! = Nil, затем устанавливая его равным nil после удаления:

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 

    ....

    if(goalItem != nil)
    {
        if(CGRectContainsPoint(goalItem.boundingBox, touch)) {
              [self removeChild:goalItem cleanup:YES];
              goalItem = nil;
        }
    }

    ....

}
0 голосов
/ 31 марта 2011

Возможно, вы пытаетесь удалить goalItem из дочерних элементов вашего представления, когда оно уже было удалено.Или так это выглядит, потому что удаление находится внутри кода для обработки касания.Возможно, goalItem мог бы обрабатывать ввод, когда он жив, вместо того, чтобы обрабатывать ввод для элемента управления в суперпредставлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...