Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从Cocos2D中的精灵表中删除精灵时出错_Objective C_Ios_Xcode_Cocos2d Iphone_Sprite Sheet - Fatal编程技术网

Objective c 从Cocos2D中的精灵表中删除精灵时出错

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

我正处于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];
}
//更新了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,这样您就可以确切地知道这些对象的位置