【发布时间】:2012-03-10 13:40:11
【问题描述】:
我正处于 iphone 游戏的初始构建阶段,我正在使用精灵表来创建一些随机的人,每个人都有头发、衣服等的子精灵。
我正在使用 CCSpriteBatchNode 将我的精灵图像存储在精灵表中。我现在只是在进行初始设置测试,您可以在其中点击屏幕以生成一组新的随机人员。所以奇怪的是,你可以点击一次,它会删除旧人并用新人替换他们,但第二次,它会崩溃并出现错误: “CCSpriteBatchNode 不包含精灵。无法删除它” 现在我确定我已将精灵添加到批处理节点,在我的 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 的内容,并且了解到删除单个 sprite 是很棘手的,所以我确信我需要在这里添加一些重要的行。感谢您的帮助!
编辑:我用谷歌搜索了错误并找到了这个线程:http://www.cocos2d-iphone.org/forum/topic/17170 这似乎证实了 Cocos2d 认为我没有将精灵添加到精灵表中 - 但我是,正如事实上,精灵第一次正确添加,而不是第二次。
一种解决方案是完全避免移除精灵,只是让它们不可见,并在需要重复使用时用新特性重新绘制它们。我宁愿知道真正的解决方案是什么,因为它看起来更干净。
【问题讨论】:
-
如果您依赖子项的顺序,请避免使用 fastRemoveObjectAtIndex。实际上,完全避免使用 fastRemoveObjectAtIndex。
-
好的,我会记住的。我是 Objective-C 的新手,来自 C++、Java、Javascript 等背景,所以 obj-c 处理数组和字符串的复杂方式让我非常沮丧。
标签: objective-c ios xcode cocos2d-iphone sprite-sheet