[cocos2d-x]碰撞检测

时间:2023-02-08 09:01:47

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


本帖最后由 musicvs 于 2014-07-18 10:42:20 编辑
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错

#2


引用 1 楼 musicvs 的回复:
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测

#3


引用 2 楼 ilikecat098 的回复:
Quote: 引用 1 楼 musicvs 的回复:

楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都 [cocos2d-x]碰撞检测

#4


引用 3 楼 ilikecat098 的回复:
Quote: 引用 2 楼 ilikecat098 的回复:

Quote: 引用 1 楼 musicvs 的回复:

楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都 [cocos2d-x]碰撞检测


removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。

你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)

#5


引用 4 楼 musicvs 的回复:
Quote: 引用 3 楼 ilikecat098 的回复:

Quote: 引用 2 楼 ilikecat098 的回复:

Quote: 引用 1 楼 musicvs 的回复:

楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都 [cocos2d-x]碰撞检测


removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。

你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)
搞好了,谢~ [cocos2d-x]碰撞检测

#6


......好像分没给上啊啊啊啊啊啊啊,坑爹啊啊啊啊啊啊 [cocos2d-x]碰撞检测

#7


不客气,以后你变牛叉了就多多来这里回答问题~ [cocos2d-x]碰撞检测

#1


本帖最后由 musicvs 于 2014-07-18 10:42:20 编辑
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错

#2


引用 1 楼 musicvs 的回复:
楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测

#3


引用 2 楼 ilikecat098 的回复:
Quote: 引用 1 楼 musicvs 的回复:

楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都 [cocos2d-x]碰撞检测

#4


引用 3 楼 ilikecat098 的回复:
Quote: 引用 2 楼 ilikecat098 的回复:

Quote: 引用 1 楼 musicvs 的回复:

楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都 [cocos2d-x]碰撞检测


removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。

你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)

#5


引用 4 楼 musicvs 的回复:
Quote: 引用 3 楼 ilikecat098 的回复:

Quote: 引用 2 楼 ilikecat098 的回复:

Quote: 引用 1 楼 musicvs 的回复:

楼主下次发代码记得加上代码标签~这样大家看起来比较方便~我已经帮你加了


然后回到问题~
你只是把upEnemy从父节点上删除了,但是你的enemies数组里还是保持了它的引用,所以这个敌人下次还是会被遍历,于是子弹又一次把它给碰撞了
所以你要彻底地把upEnemy给删除了,数组里也要把它移除~

PS:不要直接在CCARRAY_FOREACH(enemies,obj2)里把 upEnemy 从enemies里移除,在遍历数组时移除元素应该会报错
但是upEnemy只能在遍历的那个函数体里面用......怎么整......抱歉说出这么无脑的话,毕竟我C++没学好...... [cocos2d-x]碰撞检测
在碰撞检测那个函数体里enemies->removeAllObjects();
bullets->removeAllObjects();
问题解决了,但是有的敌人子弹直接就穿过去了......不好意思问了都 [cocos2d-x]碰撞检测


removeAllObjects的话,那没被子弹打中的敌人也被你移除了。。。

你创建一个新的CCArray,把要删除的敌人对象添加进这个CCArray里,在循环结束后,再遍历这个CCArray,把enemies相应的对象删除(CCArray应该是有个removeObject函数吧,没记错的话)
搞好了,谢~ [cocos2d-x]碰撞检测

#6


......好像分没给上啊啊啊啊啊啊啊,坑爹啊啊啊啊啊啊 [cocos2d-x]碰撞检测

#7


不客气,以后你变牛叉了就多多来这里回答问题~ [cocos2d-x]碰撞检测