删除Cocos2d中的精灵导致崩溃

时间:2011-03-31 11:33:50

标签: objective-c cocoa cocos2d-iphone

我有一个方法设置为触摸时删除一个精灵,我有几个精灵需要删除,但我只在下面显示一个:

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

    ....

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

    ....

}

其中 goalItem 是标头中声明的CCSprite。基本上,一旦再次调用 ccTouchEnded 方法,这会导致崩溃。

我认为这是因为该方法正在寻找 goalItem ,当它已被删除但我不确定。

安全删除精灵并确保指针不会混淆的最佳方法是什么?

我对cocos2d和objective-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 个答案:

答案 0 :(得分:1)

你正在“清理”精灵,所以在这一点之后指针很可能是垃圾。我通过检查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;
        }
    }

    ....

}

答案 1 :(得分:0)

您可能尝试在视图的子项已被删除时从其中删除了goalItem。或者它看起来像是因为删除是在处理触摸的代码内。也许goalItem可以在生存时处理输入,而不是在超视图上处理控件的输入。