Objective c 从Cocos2D中的精灵表中删除精灵时出错
我正处于iphone游戏的初始构建阶段,我正在使用精灵表创建一些随机的人,每个人的头发、衣服等都有子精灵 我正在使用CCSpriteBatchNode将我的精灵图像存储在精灵表中。我现在正在做一个初始设置测试,点击屏幕生成一组新的随机人群。所以奇怪的是,你可以点击一次,它将删除老人,并替换为新的人,但第二次,它崩溃的错误: “CCSpriteBatchNode不包含精灵。无法删除它” 现在我确定我已经将精灵添加到了批处理节点,在我的Person.m构造函数中,我有一行:Objective c 从Cocos2D中的精灵表中删除精灵时出错,objective-c,ios,xcode,cocos2d-iphone,sprite-sheet,Objective C,Ios,Xcode,Cocos2d Iphone,Sprite Sheet,我正处于iphone游戏的初始构建阶段,我正在使用精灵表创建一些随机的人,每个人的头发、衣服等都有子精灵 我正在使用CCSpriteBatchNode将我的精灵图像存储在精灵表中。我现在正在做一个初始设置测试,点击屏幕生成一组新的随机人群。所以奇怪的是,你可以点击一次,它将删除老人,并替换为新的人,但第二次,它崩溃的错误: “CCSpriteBatchNode不包含精灵。无法删除它” 现在我确定我已经将精灵添加到了批处理节点,在我的Person.m构造函数中,我有一行: [spr
[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];
}
//更新了Mazyod和Jer建议的更改
对于(int i=6;i>=0;i--){
Person*per=[u people objectAtIndex:i];
[_peoplefastremoveobjectatindex:i];
[_SpritesheetRemoveChild:每次清理:是];
per=零;
}
对于(int i=0;i<7;i++){
每人*每=零;
per=[来自国家的公民人员:_country1,带价目表:_spritesheet];
每个位置=ccp(100+(50*i),160);
[_peopleaddobject:per];
[_spritesheetaddchild:per];
}
有人能告诉我我错过了什么吗?我在cocos2d中读到了很多关于精灵表的内容,我知道移除单个精灵是一件棘手的事情,所以我确信我需要在这里添加一些重要的内容。谢谢你的帮助
编辑:我在谷歌上搜索了错误,发现了这个线程:这似乎证实了Cocos2d认为我没有将精灵添加到精灵表中——但我确实是这样,精灵第一次添加正确,而不是第二次添加正确
一种解决方案是完全避免移除精灵,只是让它们不可见,并在需要重用时使用新特性重新绘制它们。我想知道真正的解决方案是什么,因为它看起来更干净。好吧,我现在可以帮你解决一件事: 任何CCNode只能是一个父节点的子节点。它必须有一个单亲家庭 但是,这里有:
for(int i=0; i<7; i++){
Person *per = [_people objectAtIndex:i];
[self removeChild:per cleanup:YES];
[_spritesheet removeChild:per cleanup:YES];
per = nil;
}
for(int i=0;i好吧,我现在可以帮你弄清楚一件事:
任何CCNode只能是一个父节点的子节点。即,它必须有一个父节点
但是,这里有:
for(int i=0; i<7; i++){
Person *per = [_people objectAtIndex:i];
[self removeChild:per cleanup:YES];
[_spritesheet removeChild:per cleanup:YES];
per = nil;
}
(inti=0;i的看起来需要更改
[_people addObject:per];
到
在第一个循环中,您只是将数组中对象的值设置为nil,而不是将其从数组中移除。在第二个循环中,您只是将其添加到数组的末尾,但数组中已经有7个nil
让我知道它是否有效。看起来您需要更改
[_people addObject:per];
到
在第一个循环中,您只是将数组中对象的值设置为nil,而不是将其从数组中移除。在第二个循环中,您只是将其添加到数组的末尾,但数组中已经有7个nil
让我知道它是否有效。我只想在这里提及我处理这个问题的经验以及我是如何解决它的
请记住,您正在尝试删除从未添加的子项
或
两次试图带走一个孩子
我的情况就是这样。我的游戏中的碰撞检测是可靠的(至少我认为是这样)。然后随机地,比如每7-10次就有1次……我会发生碰撞。我意识到这是因为我对射弹进行了编码,一旦射弹与目标相交,就会将其移除
然而,如果我的勾选方法检测到它一次与超过1个目标发生碰撞,我没有设置故障保护
这是因为对于每个投射物,我迭代每个目标以检查碰撞,然后如果检测到碰撞,则删除相应的投射物。因此,我创建了一个简单的BOOL,如果它已经与目标碰撞,则将其设置为YES。然后,我仅在投射物未与任何物体碰撞时检查碰撞
所以……在:
if (CGRectIntersectsRect(projectileRect, targetRect))
{
//code to remove projectile
}
之后:
if (CGRectIntersectsRect(projectileRect, targetRect) && projectile.hasHitaTarget == NO)
{
//code to remove projectile
}
我只想谈谈我在这方面的经验,以及我是如何解决这个问题的
请记住,您正在尝试删除从未添加的子项
或
两次试图带走一个孩子
我的情况就是这样。我的游戏中的碰撞检测是可靠的(至少我认为是这样)。然后随机地,比如每7-10次就有1次……我会发生碰撞。我意识到这是因为我对射弹进行了编码,一旦射弹与目标相交,就会将其移除
然而,如果我的勾选方法检测到它一次与超过1个目标发生碰撞,我没有设置故障保护
这是因为对于每个投射物,我迭代每个目标以检查碰撞,然后如果检测到碰撞,则删除相应的投射物。因此,我创建了一个简单的BOOL,如果它已经与目标碰撞,则将其设置为YES。然后,我仅在投射物未与任何物体碰撞时检查碰撞
所以……在:
if (CGRectIntersectsRect(projectileRect, targetRect))
{
//code to remove projectile
}
之后:
if (CGRectIntersectsRect(projectileRect, targetRect) && projectile.hasHitaTarget == NO)
{
//code to remove projectile
}
好的方面-我没有意识到,虽然我实际上没有添加两次精灵,但在那里只删除了两次。我删除了[self-removechild],但仍然得到相同的错误。好的方面-我没有意识到,虽然我没有添加两次精灵,但在那里只删除了两次。我删除了[self-removechild]但是仍然得到相同的错误。嘿,你完全正确!看起来replaceObjectAtIndex:withObject:是CoCoCos3D的数组类的成员,而不是Cocos2D。我能够用fastRemoveObjectAtIndex和addObject实现相同的效果。但是最初的问题仍然存在。replaceObjectAtIndex:withObject:也是NSMutableArray的一部分,它是我以为您正在使用,但无论如何……对于使用addObject之类的方法,我总是有点犹豫,因为您并不总是确定数组是否为空。尝试使用insertObject:atIndex:而不是addObject,这样您就可以确切地知道这些对象的位置