我有一个方法设置为触摸时删除一个精灵,我有几个精灵需要删除,但我只在下面显示一个:
-(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只选择一个选项。
答案 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可以在生存时处理输入,而不是在超视图上处理控件的输入。