我设置了一种在触摸时删除 Sprite 的方法,我有几个需要删除的 Sprite ,但我只在下面显示了一个:
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
....
if(CGRectContainsPoint(goalItem.boundingBox, touch)) {
[self removeChild:goalItem cleanup:YES];
}
....
}
其中goalItem是 header 中声明的CCSprite。基本上,一旦再次调用 ccTouchEnded 方法,这就会导致崩溃。
我认为这是因为该方法正在寻找已被删除的goalItem,但我不确定。
安全删除 Sprite 并确保指针不会混淆的最佳方法是什么?
我对 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 仅选择一个选项。
最佳答案
您正在“清理” Sprite ,因此在此之后指针可能会变成垃圾。我通过检查 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;
}
}
....
}
关于objective-c - 在 Cocos2d 中删除 Sprite 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5499144/