0
void SkillManager::initBuff() {
CCObject* pobj;
CCLog("in init Buff");
CCARRAY_FOREACH(mSkills, pobj) {
    Skill* skill = (Skill*) pobj;
    CCLog("skillDuration:%d,skillIndex: %d",skill->mSkillDuration,skill->mSkillDebuffTag);
    if (skill->mSkillDuration <= 0) {
        mSkills->removeObject(skill);
    }
    else
        skill->initBuffData();
}

}

我创建了一个 CCarray mSkills 来保存我的技能,当技能的持续时间结束时,我将其从数组中删除,每次在检查一个技能的持续时间之前我都会记录它的持续时间和 debuff 标签。我还会在任何时候添加一些技能数组时间。

在大多数情况下,代码运行良好。但偶尔的错误对我来说是一种痴迷。

在正常情况下,日志是:

Cocos2d: init Buff

Cocos2d:skillDuration:6,skillIndex:203

Cocos2d:持续时间:6

Cocos2d: init Buff

Cocos2d:skillDuration:5,skillIndex:203

Cocos2d:skillDuration:2,skillIndex:0

Cocos2d: init Buff

Cocos2d:skillDuration:4,skillIndex:203

Cocos2d:持续时间:4

Cocos2d:skillDuration:1,skillIndex:0

Cocos2d:skillDuration:0,skillIndex:0

在错误日志中是:

ocos2d: init Buff

Cocos2d:skillDuration:1,skillIndex:0

Cocos2d:skillDuration:6,skillIndex:203

Cocos2d:持续时间:6

Cocos2d: init Buff

Cocos2d:skillDuration:0,skillIndex:0

Cocos2d:skillDuration:2,skillIndex:0

Cocos2d:skillDuration:1,skillIndex:0

Cocos2d: init Buff

Cocos2d:skillDuration:5,skillIndex:203

Cocos2d:skillDuration:0,skillIndex:0

Cocos2d:skillDuration:0,skillIndex:0

Cocos2d: init Buff

Cocos2d:skillDuration:4,skillIndex:203

Cocos2d:持续时间:4

Cocos2d:skillDuration:2,skillIndex:0

是指索引为203的技能发生了变化,还是CCArray此时得到了错误的数据?但我可以在下一次 init Buff 中看到 203 的数据是正确的。

我发现使用 CCARRAY_FOREACH 时如果更改数组中的数据会出现一些错误。但是这次我将其更改为 for() {} 问题仍然存在。

有人知道这个问题吗?

4

1 回答 1

2

您不想CCArray在迭代过程中从 a 中删除一个元素。尝试:

for(int i = mSkills->count() - 1; i >= 0; i--) {
    Skill *skill = mSkills->objectAtIndex(i);
    ...
}

这不是最有效的,但您似乎也不会在此功能上花费大量时间。让我知道这是否有帮助。

解释

当您从 a 中删除一个元素时CCArray,该实现会将所有后面的元素上移一个位置,以填补缺失元素造成的空白。

如果您正在向前迭代,那么您正在移动尚未访问过的元素,并且您最终会在删除元素后跳过该元素。向后遍历数组可以解决这个问题,因为您已经访问过要移动的元素。

于 2013-10-31T04:23:21.923 回答