void FirstGame::update(float dt)
{
//遍历子弹数组
CCObject *obj1=NULL;
CCSprite *upBullet=NULL;
CCARRAY_FOREACH(bullets,obj1)
{
upBullet=(CCSprite*)obj1;
//遍历敌人数组
CCObject *obj2=NULL;
CCSprite *upEnemy=NULL;
CCARRAY_FOREACH(enemies,obj2)
{
upEnemy=(CCSprite*)obj2;
//碰撞检测
if(bullets==NULL)
CCLOG("Array is clear");
else if(upBullet->boundingBox().intersectsRect(upEnemy->boundingBox()))
{
//隐藏敌人
c
//隐藏子弹
this->removeChild(upBullet);
break;
}
}
}
}
代码运行的效果是子弹碰到敌人,然后两个同时消失,第二个子弹如果到了上次消失的地方,第二个子弹也会消失,就好像那个地方有敌人一样,就像是this->removeChild(upEnemy);只是把图片从屏幕上移除了,但其实敌人还在被击中点停留......
请问我的代码哪里错了
7 个解决方案
#1
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
#2
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好......
#3
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
#4
在碰撞检测那个函数体里enemies->removeAllObjects(); 但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好......
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。
你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)
#5
在碰撞检测那个函数体里enemies->removeAllObjects(); 但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好......
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。
你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)
#6
......好像分没给上啊啊啊啊啊啊啊,坑爹啊啊啊啊啊啊
#7
不客气,以后你变牛叉了就多多来这里回答问题~
#1
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
#2
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
#3
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好......
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
#4
在碰撞检测那个函数体里enemies->removeAllObjects(); 但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好......
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。
你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)
#5
在碰撞检测那个函数体里enemies->removeAllObjects(); 但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好......
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了
然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~
PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都
removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。
你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)
#6
......好像分没给上啊啊啊啊啊啊啊,坑爹啊啊啊啊啊啊
#7
不客气,以后你变牛叉了就多多来这里回答问题~