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以保存我的技能,当技能的持续时间结束时,我将其从阵列中删除,每次检查一个技能的持续时间之前我将cclog它的持续时间和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(){}问题仍然存在。
有人知道这个问题吗?
答案 0 :(得分:2)
您不希望在迭代过程中从CCArray
中删除元素。尝试:
for(int i = mSkills->count() - 1; i >= 0; i--) {
Skill *skill = mSkills->objectAtIndex(i);
...
}
这不是最有效的,但似乎你不会在这个功能上花费大量时间。如果有帮助,请告诉我。
<强>解释强>
当您从CCArray
中删除元素时,该实现会将所有后面的元素向上移动一个点以填充由缺少的元素创建的间隙。
如果你正在向前进行迭代,那么你正在移动尚未访问过的元素,并且最终会在删除元素之后跳过该元素。向后遍历数组可以解决这个问题,因为您已经访问了要移动的元素。