objective-c - 在 Cocos2d 中删除 Sprite 导致崩溃

标签 objective-c cocoa cocos2d-iphone

我设置了一种在触摸时删除 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/

相关文章:

ios - 如何添加多个电话号码,如联系人应用程序 IOS 7

ios - id myObj<MyProtocol> vs if([obj 类]符合ToProtocol :@protocol(MyProtocol) )

multithreading - 使用 Interface Builder 绑定(bind)来观察非主线程上更改的属性是否安全?

cocoa - 指定在外观上编辑 NSPopover 内的 NSTextField

iphone - 如何在cocos2d中更改场景同时保留原始场景的状态

ios - 如何在现有图像上添加水印

iphone - iOS canOpenURL : how to return NO when no sim on iPhone?

macos - 为什么 NSDictionary 的 allKeys 和 allValues 方法返回 NSArray 而不是 NSSet?

iPhone Cocos2d 加载场景

ios - 如何缩放physicsBody?