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逻辑.

可能我代码逻辑也有问题,不能依赖于方法的重入次数.因为有了物理引擎回调这个不确定因素,所以使得问题发生的很显然.

Chipmunk碰撞回调短时间内重入的解决办法的更多相关文章

  1. 【转】自定义UITableViewCell控件阻挡回调不到didSelectRowAtIndexPath的解决办法

    原文网址:http://blog.talisk.cn/blog/2015/09/01/uitableview-didselectrowatindexpath-cannot-be-called-tips ...

  2. ubuntu - 14.04,由于安装软件造成磁盘空间不足,无法登入Gnome解决办法!!

    刚才安装了半天软件,最后出现磁盘空间不足的问题,刚开始我还以为ubuntu和我开玩笑,随后我重新启动它才发现真不是开玩笑,我已经进不去Gnome桌面了!!! 解决办法: 1,以root身份进入shel ...

  3. warning C4005: “AF_IPX”: 宏重定义的解决办法

    warning C4005: “AF_IPX”: 宏重定义warning C4005: “AF_IPX”: 宏重定义 解决方法: 由以上代码可以看出如果在没有定义WIN32_LEAN_AND_MEAN ...

  4. java 实现多个接口 方法重名的解决办法——内部类

    package com.kk.innerClass; /** * 通过内部类实现接口 * 解决多个接口中方法重名问题 * */interface Machine { void run();} clas ...

  5. robotium重签名使用解决办法

    用re-sign重新签名,出现error,提示缺少zipalign 解决方案: 下载zipalign.exe,地址:http://pan.baidu.com/s/1geoHemR 下载后将zipali ...

  6. 用re-sign.jar重签名apk后安装失败的解决办法

    问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...

  7. 不可重入定时器Newlife.TimerX

    在.net常用的定时器类有下面三种,使用定时器时需要设定参数,如间断时间.定时器计溢出后的回调函数.延时.开始等,定时器的的主要方法有开始.终止等,不同的定时器实现上述的方法会有一些差异,本文会针对具 ...

  8. 举例讲解Python中的死锁、可重入锁和互斥锁

    举例讲解Python中的死锁.可重入锁和互斥锁 一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一 ...

  9. Java多线程可重入锁例子解析

    “可重入锁”的概念是:自己可以再次获得自己的内部锁.比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁. cla ...

随机推荐

  1. 首届.NET Core开源峰会

    首届.NET Core开源峰会 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与 形式:每个主题5分钟-15分钟闪电演讲 演讲方式 ...

  2. CI下载与安装_基础配置_MVC

    CI:CodeIgniter -- 由Ellislab公司的CEORickEllis开发,是一个简单快速的PHP MVC框架. =============下载和安装================地址 ...

  3. CentOS Linux上安装Oracle11g笔记

    CentOS Linux上安装Oracle11g 到 otn.oracle.com 网站上下载 Linux版的oracle 11g 编辑 /etc/sysctl.conf : kernel.shmal ...

  4. C++笔记010:C++对C的扩展——register关键字增强

    register关键字:请求编译器让变量直接放到CPU内部寄存器里面,而不是通过内存寻址访问,速度快. 在C语言中,register修饰的变量不能取地址,去寄存器变量的地址在C语言里面是会出错的. i ...

  5. PHP 5 MySQLi 函数

    在 PHP 中使用 MySQLi 函数需要注意的是:你需要添加对 MySQLi 扩展的支持. PHP MySQLi 简介 PHP MySQLi = PHP MySQL Improved! MySQLi ...

  6. 介绍Docker仓库

    仓库(Repository)是集中存放镜像的地方. 一个容易混淆的概念是注册服务器(Registry).实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像.从 ...

  7. Django URL (路由系统)

    URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那 ...

  8. Android图表库MPAndroidChart(四)——条形图的绘制过程过程,隐隐约约我看到了套路

    Android图表库MPAndroidChart(四)--条形图的绘制过程过程,隐隐约约我看到了套路 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...

  9. iOS 用RunTime来提升按钮的体验

    用RunTime来提升按钮的体验 载请标明出处:http://blog.csdn.net/sk719887916/article/details/52597388,作者:Ryan 经常处理按钮问题都是 ...

  10. 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。

    提示:hash表 #include <iostream> using namespace std; #define N 100 #define RANGE 100 int* getRand ...