Cocos2d iphone Cocos2dx我在CCArray上出了点问题 void SkillManager::initBuff(){ cObject*pobj; CCLog(“初始Buff中”); CCARRAY_FOREACH(mSkills,pobj){ 技能*技能=(技能*)pobj; CCLog(“技能持续时间:%d,技能索引:%d”,技能->mSkillDuration,技能->mSkillDebuffTag); if(skill->mSkillDuration removeObject(skill); } 其他的 skill->initBuffData(); }

Cocos2d iphone Cocos2dx我在CCArray上出了点问题 void SkillManager::initBuff(){ cObject*pobj; CCLog(“初始Buff中”); CCARRAY_FOREACH(mSkills,pobj){ 技能*技能=(技能*)pobj; CCLog(“技能持续时间:%d,技能索引:%d”,技能->mSkillDuration,技能->mSkillDebuffTag); if(skill->mSkillDuration removeObject(skill); } 其他的 skill->initBuffData(); },cocos2d-iphone,Cocos2d Iphone,} 我创建一个CCarray mSkills来保存我的技能,当技能的持续时间结束时,我将其从阵列中移除,每次检查一个技能的持续时间之前,我都会记录它的持续时间和减益标签。我还将随时在阵列中添加一些技能 在大多数情况下,代码运行良好。但偶尔出现的错误对我来说是一种困扰 正常情况下,日志为: Cocos2d:在初始Buff中 Cocos2d:skillDuration:6,skillIndex:203 Cocos2d:持续时间:6 Cocos2d:在初始Buff中 Cocos2d:skillDura

}

我创建一个CCarray mSkills来保存我的技能,当技能的持续时间结束时,我将其从阵列中移除,每次检查一个技能的持续时间之前,我都会记录它的持续时间和减益标签。我还将随时在阵列中添加一些技能

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

正常情况下,日志为:

Cocos2d:在初始Buff中

Cocos2d:skillDuration:6,skillIndex:203

Cocos2d:持续时间:6

Cocos2d:在初始Buff中

Cocos2d:skillDuration:5,skillIndex:203

Cocos2d:技能持续时间:2,技能索引:0

Cocos2d:在初始Buff中

Cocos2d:skillDuration:4,skillIndex:203

Cocos2d:持续时间:4

Cocos2d:技能持续时间:1,技能索引:0

Cocos2d:skillDuration:0,skillIndex:0

在错误日志中是:

ocos2d:在init Buff中

Cocos2d:技能持续时间:1,技能索引:0

Cocos2d:skillDuration:6,skillIndex:203

Cocos2d:持续时间:6

Cocos2d:在初始Buff中

Cocos2d:skillDuration:0,skillIndex:0

Cocos2d:技能持续时间:2,技能索引:0

Cocos2d:技能持续时间:1,技能索引:0

Cocos2d:在初始Buff中

Cocos2d:skillDuration:5,skillIndex:203

Cocos2d:skillDuration:0,skillIndex:0

Cocos2d:skillDuration:0,skillIndex:0

Cocos2d:在初始Buff中

Cocos2d:skillDuration:4,skillIndex:203

Cocos2d:持续时间:4

Cocos2d:技能持续时间:2,技能索引:0

这意味着索引为203的技能发生了变化,或者CCArray此时得到了错误的数据? 但我可以在下一次initbuff中看到203的数据是正确的

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


有人知道这个问题吗?< /P> < P>在迭代的过程中,你不想从<代码> CCArray < /代码>中删除一个元素。
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
中删除一个元素时,实现会将所有后面的元素向上移动一个位置,以填补缺少的元素所造成的空白


如果正向迭代,则移动的是尚未访问过的元素,最后在删除该元素后跳过该元素。向后迭代数组可以解决此问题,因为您已经访问了正在移动的元素。

谢谢,上次遇到问题时,在索引处获取元素很有帮助在CCArray中。所以这次我也尝试了,但没有成功。@ShineHe只是在检查…你尝试了以相反的顺序遍历数组,从最后一个元素开始,然后向后运行?非常感谢!!它成功了,我按照你说的那样更改了代码,并且成功了。@ShineHe很乐意帮助。:-)我只是将“for(int I=0;Icount();I++)”改为“对于(int i=mSkills->count()-1;i>=0;i--)”,问题消失了…为什么?您可以发布任何其他修改mSkills的代码吗?它可能在其他地方损坏。
for(int i = mSkills->count() - 1; i >= 0; i--) {
    Skill *skill = mSkills->objectAtIndex(i);
    ...
}