objective-c - 从 Cocos2D 的 Sprite 表中删除 Sprite 时出错

标签 objective-c ios xcode cocos2d-iphone sprite-sheet

我正处于 iPhone 游戏的初始构建阶段,我正在使用 sprite 表创建一些随机的人,每个人都有头发、衣服等子 Sprite 。

我使用 CCSpriteBatchNode 将 Sprite 图像存储在 Sprite 表中。我现在只是在进行初始设置测试,您可以在其中点击屏幕以生成一组新的随机人。所以奇怪的是,你可以点击一次,它会移除旧人并用新人替换他们,但是第二次,它会崩溃并出现错误: “CCSpriteBatchNode 不包含 Sprite 。无法删除它” 现在我确定我已经将 Sprite 添加到批处理节点,在我的 Person.m 构造函数中我有这一行:

        [spriteSheet addChild:person];

在我的 ccTouchesEnded 测试代码中,我得到了以下代码:

//updated with changes suggested by Mazyod and Jer
for(int i=6; i>=0; i--){
    Person *per = [_people objectAtIndex:i];
    [_people fastRemoveObjectAtIndex:i];
    [_spritesheet removeChild:per cleanup:YES];
    per = nil;
}


for(int i = 0; i < 7; i++){
    Person *per = nil;
    per = [Citizen personFromCountry:_country1 WithSpriteSheet:_spritesheet];
    per.position = ccp(100 + (50 * i),160);
    [_people addObject:per];
    [_spritesheet addChild:per];
}

任何人都可以建议我缺少什么吗?我已经阅读了很多关于 cocos2d 中的 spritesheets 的内容,并且了解到删除单个 sprites 是很棘手的,所以我确信我需要在这里添加一些重要的行。感谢您的帮助!

编辑:我用谷歌搜索错误并找到了这个线程:http://www.cocos2d-iphone.org/forum/topic/17170这似乎证实了 Cocos2d 认为我没有将 sprite 添加到 spritesheet - 但事实证明我是,因为 sprite 第一次正确添加,而不是第二次。

一个解决方案是完全避免删除 Sprite ,只是让它们不可见,并在需要重新使用时使用新特征重新绘制它们。我宁愿知道真正的解决方案是什么,因为它看起来更干净。

最佳答案

看来你需要改变

[_people addObject:per];

[_people replaceObjectAtIndex:i withObject:per];

在您的第一个循环中,您只是将数组中对象的值设置为 nil,而不是将其从数组中移除。在第二个循环中,您只需将它添加到数组的末尾,但您的数组中已经有 7 个 nil。

让我知道它是否有效。

关于objective-c - 从 Cocos2D 的 Sprite 表中删除 Sprite 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9357334/

相关文章:

ios - 在运行时在 iOS 上添加框架

ios - 如何让所有子类都必须遵守协议(protocol)?

objective-c - 检测自定义表格单元格内多个 UI View 的点击/触摸的理想方法是什么?

ios - 获取 Ogg 的 Opus header

ios - 未观察到 KVC NSKeyValueChangeRemoval

iphone - 如何检测 UIImageview 的动画方向?

ios - 以特定方式将 String 转换为 NSAttributedString

objective-c - UIImageJPEG表示

ios - 在 App Store 上已有旧版本后,在 TestFlight 上上传新版本

ios - 品牌应用程序中使用的主应用程序的图标