申明三个刚体,一个飞镖,两只怪物。碰撞执行oncontactbegin函数
bool HelloWorldone::onContactBegin(const cocos2d::PhysicsContact &contact)
{
CCLog(“xxxxxx”);
Sprite* spriteA = (Sprite*)contact.getShapeA()->getBody()->getNode();
Sprite* spriteB = (Sprite*)contact.getShapeB()->getBody()->getNode();
auto tagA = spriteA->getTag();
auto tagB = spriteB->getTag();
//下面是执行碰撞函数的内容
…
spriteA->removeFromParent;
spriteB->removeFromParent;
//移除精灵;
return true;
}
当三个精灵同时碰撞(起先我也不相信,按电脑的运行速度是不会存在同时相碰的情况的,但经过我的测试,存在。 ),程序会中断,中断处指向auto tagA = spriteA->getTag();
这个问题困扰我3个星期了,本人 是个新手,求助。我试着不移除精灵,结果不会报错。其他情况,一个飞镖对一只怪物,不会报错。求指导!!
一楼献给所有辛苦工作的程序们。
不要在碰撞检测的过程中移除对象,因为后边可能这个对象还有其他的碰撞检测需要用到这个对象,可以把要移除的对象记录下来,在碰撞检测完成后再统一的删除
你的怪物是单例吧?,看看怪物的代码,你的怪物的tag应该设置错了
谢谢您,那为什么会存在已经移除的精灵还会进行其他的碰撞检测呢?按电脑的运行速度应该不存在这种情况哈。“可以把要移除的对象记录下来,在碰撞检测完成后再统一的删除”这该怎么做呢?
怪物有很多种,每种我都设置成了不同的tag,碰撞检测是按这种方法进行的:
if (spriteA->getTag() == 1 || spriteB->getTag() == 1)
{//tag为1的是怪物;
if (spriteA->getTag() == 1)
{
if(spriteB->getTag()==2||spriteB->getTag()==20||spriteB->getTag()==20||spriteB->getTag()==20||…)//tag为2x的都是飞镖
{
spriteA->removeFromParent;
spriteB->removeFromParent;
return true;//因为函数里执行了很多不同的内容,不能完全发出来,所以我这里只写了大概的结构;
}
}
else if( spriteB->getTag() == 1)
{
if(spriteB->getTag()==2||spriteB->getTag()==20||spriteB->getTag()==20||spriteB->getTag()==20||…)
{
spriteA->removeFromParent;
spriteB->removeFromParent;
return true;
}
}
}
以你的代码为例,在同一帧内要判断三次碰撞检测,飞镖 - 怪物A, 飞镖-怪物B, 怪物A-怪物B, 这几个对象已经保存在一个数组里,通过遍历来检测三个碰撞检测,而你在第一个碰撞检测时飞镖-怪物A碰撞时就把两个物体移除了,这时候也会从物理世界移除,而物理引擎还有一个方法在遍历检测3个碰撞,这时候就会有冲突,可能会引起问题。这个只是我自己的理解,没有具体的研究源代码,一般不会在物理引擎的碰撞检测过程中移除物理对象,你可以把怪物和飞镖保存在一个vector中,在一个定时器中不断的判断vector是否为空,如果不为空就把vector中的所有对象从parent移除,然后清空vector。不确定你的问题是这个引起的,只是觉得这里的逻辑有问题
谢谢,实在太感谢你了!!学习了,再次感谢!
好不容易把中断问题解决了,新的终止问题又出来了。。。
Assert failed: Node still marked as running on node destruction! Was base class onExit() called in derived class onExit() implementations?
Assertion failed!
Program: …e\hellococos\proj.win32\Debug.win32\hellococos.exe
File: CCNode.cpp
Line: 189
Expression: !_running
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts
中断点的是NODE里面的
if (nCode == IDRETRY)
{
__debugbreak();
/* return to user code */
return;
}
可否请您帮我判断一下大概是哪里出了问题吗?谢谢了。
“Assert failed: Node still marked as running on node destruction! Was base class onExit() called in derived class onExit() implementations?”
这句话看起来是提示你某个派生类的onExit()方法里没有调用基类的onExit()方法,导致节点还是被标记为running
哦,意思是我最好还是在每个类中加上OnExit(),然后把时间分发机制给取消掉吗?我的事件分发器写在了INIT函数里(因为我用到了pushScene转换场景,将事件分发器写在OnEnter函数中老是中断,网上的朋友说最好写在INIT函数里)。
不是,是你写的类里如果继承了Layer, Node等cocos2dx的类,如果你重写了onExit()方法,在onExit()方法里必须要调用父类的onExit(),不然会出错,如果没有重写就不用管了
我的类是继承了Layer,可是我没有写onExit()方法。您的意思是我要改掉错误就得写一个onExit()方法,然后在onExit()方法里必须要调用父类的onExit()吗?那我该怎样写呢?实在不好意思,我才学不久,问题有点多,谢谢了。
没有的话就不用写了,看不到代码也看不出来哪里出问题了
如果您方便的话再请教您两个个问题:第一个:两个场景,第一个场景用计时器调用函数每秒创建了一只怪物,然后popscene切换到第二个场景,我想问有没有简单的方法当跳转第二个场景时可以清除第一个场景中已经加载的怪物,并且第二个场景popscene回第一个场景后依然可以重新创建同一种怪物。
第二个:我的游戏图片和音乐就30M,我按网上的教程用texturepacker将所有图片做成大图,但并没有减少内存,我又用PNGoo将图片瘦身,我想问用texturepacker做出来的tupian.png是否可以用PNGoo将tupian.png瘦身后得到的tupian1.png代替原来的tupian,png?请问还有没有其他有效的瘦身的办法呢?音乐该怎么做呢?