1

一段时间以来一直在为 iOS 开发塔防游戏。我正在使用 Cocos2d(不确定 v0.99.5)。当我开始删除精灵时,最近开始遇到一些问题。

使用仪器和僵尸拥有个人资料,这就是我得到的:

僵尸踪迹 更新精灵(以及删除它们)的代码位于更新中:

-(void) update:(ccTime)deltaTime {
if (paused)
    return;

CCArray *childs = [textureAtlas children];

//Update all objects
for (GameSprite *tempChar in childs) {
    if ([tempChar respondsToSelector:@selector(updateStateWithDeltaTime:andListOfGameObjects:andAtlas:)]) {
        [(GameSprite*)tempChar updateStateWithDeltaTime:deltaTime andListOfGameObjects:[textureAtlas children] andAtlas:textureAtlas]; 
    }
}

//Remove dead projectiles
for (GameSprite *tempChar in childs) {          
    if ([tempChar isKindOfClass:Projectile.class]) {  //(**)
        if (![tempChar alive]) {
            [tempChar remove];
        }
    }
}

//Remove dead towers
for (GameSprite *tempChar in childs) {
    if ([tempChar isKindOfClass:Tower.class]) {
        if (![tempChar alive]) {
            [tempChar remove];
        }
    }
}
//Remove dead creeps
for (GameSprite *tempChar in childs) {
    if ([tempChar isKindOfClass:Creep.class]) {
        if (![tempChar alive]) {
            [tempChar remove];
        }
    }
}
}

GameSprite.m 中的 remove 方法:

-(void)remove {
    CCLOG(@"remove");
    [self removeFromParentAndCleanup:YES];
}

第一个块更新 SpriteBatchNode/textureAtlas 中的精灵。剩下的三个块检查不同的对象是否应该被删除。(他们的活动变量设置为否?)。我有三个不同类型的方块的原因是因为射弹对它们射击的小兵有(弱)参考,需要在小兵之前删除。

所以我的问题是,当射弹击中小兵并且要移除射弹(以及向该小兵射击的所有其他射弹)时,它会随机崩溃)。爬虫引用计数降至 0,但似乎仍在 childs 数组中。因为我得到的错误是:

*** -[NormalProjectile isKindOfClass:]: message sent to deallocated instance 0xff33e30

在我用 (**) 标记的行上

要么是我理解 Cocos2d 的 removeFromParentAndCleanUP: 的问题,要么是我处理弹丸-蠕变-关系的“解决方案”从记忆的角度来看是不好的。有关如何解决此问题或进一步调试的任何想法?

4

1 回答 1

3

您用于遍历数组的快速枚举技术正在将该数组中的所有精灵转换为 CCSprite 的自定义子类,然后检查它们是否是不同的自定义子类,例如 Tower 等。我认为这不健康编程实践,因为一个类中的方法可能不在另一个类中,但您仍然在强制转换它们。

这可能会或可能不会导致您的问题,但更明智的方法是为assign特定班级的孩子保留 iVar CCArray。即,在创建所有射弹并将它们添加到批处理节点时将它们放入一个数组中,然后您可以通过遍历这些单独的数组来遍历所有射弹、塔等,在那里您知道它们已经是哪种类。然后在必要时将它们从数组和父级中删除。我认为这比完整浏览您的批处理节点中的所有游戏精灵要安全得多,其中可能包括未使用的恶意,以及将它们作为不同的类进行投射和测试。

于 2012-03-07T02:00:48.143 回答