Chipmunk引擎中碰撞行为可能在细微处与一般认识略有不同.
比如碰撞回调方法可能会重入.不知道方法(函数)重入概念的童鞋可以自行谷哥或度娘.
第一次碰撞方法还未返回,第二次碰撞回调又被调用了.至于它们是否运行在同一线程,这个不知道.至少我调试中都在一个线程里.但在一个线程里也会发生重入.这里研究的不深入,有错误请指出.
最开始碰撞回调方法如下:
-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode *)star
stick:(CCNode *)stick{
StarType starType;
if (!star) {
return YES;
}
starType = ((Star*)star).starType;
star = nil;
}
//working
[star removeFromParentAndCleanup:YES];
return YES;
}
以上代码中的working短时间内偶尔会执行2次.第1次修改将star removeFromParentAndCleanup调用移至方法前部也不行.
第2次修改如下:
@synchronized(self){
if (!star) {
return YES;
}
starType = ((Star*)star).starType;
[star removeFromParentAndCleanup:YES];
star = nil;
}
//working...
仍然不行,从日志上看star调用remove方法后其值仍有可能不为nil,导致if判断失败.
第3次修改增加了if判断条件为:
if (!star || !star.parent) {
return YES;
}
代码逻辑工作正常,在第二次重入时,star.parent一定为(还是不能肯定,说”应该为”比较妥当 ;)nil,所以避免了再次调用working逻辑.
可能我代码逻辑也有问题,不能依赖于方法的重入次数.因为有了物理引擎回调这个不确定因素,所以使得问题发生的很显然.
时间: 2024-10-29 03:08:53