首先判断问题出现在Star的类方法doStickShorterWork中,于是逐步分词注释代码,最后剩下如下代码:

+(void)doStickShorterWork:(Stick *)stick{
    GameScene *gameScene = [GameScene sharedGameScene];
    CCPhysicsNode *physicsWorld = (CCPhysicsNode*)stick.parent;

    @synchronized(gameScene){
        if ([stick.name isEqualToString:@"stickShorter"]) {
            return;
        }

        if ([stick.name isEqualToString:@"stickLonger"]) {
            Stick *stickNormal = [Stick stickNormal];
            stickNormal.position = stick.position;
            [physicsWorld removeChild:stick cleanup:YES];

            [physicsWorld addChild:stickNormal];
            gameScene.stickInGameScene = stickNormal;
            return;
        }
    }

    CGPoint position = stick.position;
    __block Stick *stickShorter;

    @synchronized(gameScene){
        stickShorter = [Stick stickShorter];
        [physicsWorld removeChild:stick cleanup:YES];

        stickShorter.position = position;
        [physicsWorld addChild:stickShorter];
        gameScene.stickInGameScene = stickShorter;
    }
}

省略掉了stick变短动画和恢复尺寸的代码,问题依旧.

在经过N次注释,编译,运行的Loop后,将问题逐渐锁定在stick没有正确删除上.遂再次推理涉及到可能删除与引用冲突的代码逻辑.

最后推断如果在五角星碰撞stick后,在碰撞回调中如果此时删除了stick会发生什么!?这肯定不是物理引擎愿意看到的情形:在物理对象的碰撞回调中,该物理对象竟然被删除了!这个显然不合常理,但在该App中是有可能发生的.

如果在Star类方法中stick删除代码调用时,碰撞回调方法还未返回,就会发生stick已经没有了,同时物理引擎还认为其存在的情况.

简单来说如果stick删除时,碰撞回调在运行就会出现僵尸对象,如果stick删除时,碰撞回调方法已经返回,则一切正常.这也符合僵尸对象随机出现的现象.

Chipmunk僵尸物理对象的出现和解决(七)的更多相关文章

  1. Chipmunk僵尸物理对象的出现和解决(一)

    最近在写的BrickHit游戏App中出现了一个比较头疼的问题. 该问题很难用常规手段调试,因为其发生看起来貌似是随机的. 我想在这里将这个问题的现象和解决过程详细的记录下来,一来避免其他童鞋走弯路, ...

  2. Chipmunk僵尸物理对象的出现和解决(五)

    ,因为将反弹棒变长和缩短的代码是类似的所以我们只看一个即可,就让我们详细看看缩短的方法吧. +(void)doStickShorterWork:(Stick *)stick{ GameScene *g ...

  3. Chipmunk僵尸物理对象的出现和解决(二)

    如第一篇文章中图片所示,该游戏是一个弹球游戏. 玩法很简单,屏幕底部有一个反弹棒,用来确保小球不掉出屏幕同时反弹小球撞击屏幕上方的砖块. 玩家可以触摸屏幕来左右移动反弹棒. 等等!还不是这么简单,当小 ...

  4. Chipmunk僵尸物理对象的出现和解决(八)

    如何解决? 等到碰撞方法返回后在调用Star类方法.碰撞方法在物理引擎的一帧内应该会处理完成,在下一帧里碰撞回调已经结束.所以我们将Star类方法的调用放到下一帧里执行即可,代码如下: //... @ ...

  5. Chipmunk僵尸物理对象的出现和解决(六)

    既然出现了这个问题下面就是如何找到原因. 因为该问题不是每次都出现,偶尔反弹棒碰到五角星时才会多出一个僵尸棒,现象比较随机,较难悉知具体原因. 有时多次触碰又没有出现问题,有时短时间内每次触碰都出现问 ...

  6. Chipmunk僵尸物理对象的出现和解决(三)

    首先是触摸移动反弹棒的代码: -(void)touchMoved:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ CGPoint location ...

  7. Chipmunk僵尸物理对象的出现和解决(四)

    接上一篇,我们看看五角星和反弹棒碰撞时的代码: -(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode * ...

  8. SpriteKit改变Node锚点其物理对象位置不对的解决

    在创建Node的物理对象后,默认情况下物理对象和Node的实际边界相应的非常好,由于此时Node的默认锚点是当中心位置即(0.5,0.5),只是假设我们改变了Node的锚点,就会发现其物理边界还是保持 ...

  9. Jquery中使用setInterval和setTimeout会提示缺少对象的错误,解决方法如下:

    直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 应用jQuery的扩展可以解决这个问题. $(document).ready(function(){ $.extend( ...

随机推荐

  1. gdb调试的基本使用

    GDB调试 启动程序准备调试 GDB yourpram 或者 先输入GDB 然后输入 file yourpram 然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传 ...

  2. Openlayers3学习心得(初识)

    最近刚辞了原来的那家公司,准备新找一份工作.其中有个公司要求会Openlayers3.一看到这个要求,就知道公司业务涉及地图图表比较多. Openlayers本身是一个基于GIS地图相关的功能丰富的J ...

  3. 守护态运行Docker容器

    更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行.此时,可以通过添加 -d 参数来实现. 例如下面的命令会在后台运行容器. $ sudo docker run -d ...

  4. CodeBlocks使用小技巧

    1.基本使用: CodeBlocks使用介绍 2.一定要建项目才能编译运行代码吗? 不一定,也可以直接新建文件,直接运行. 如何管理这些未纳入项目的文件?通过左侧Management面板,切换到Fil ...

  5. Linux 下不经过BIOS重启(i386)

    前段时间有个项目,要求在Linux下不经过BIOS重启,i386平台. 一.可行性分析 众所周知,BIOS中包含了CPU及其他各种设备的初始化代码,Linux系统运行之后是否能够将各种用到的设备返回到 ...

  6. ANT不完全总结,包含各种命令,ant例子等,转自:http://lavasoft.blog.51cto.com/62575/87306

    ANT不完全总结   好久没有用Ant了,最近让MyEclipse.JBuilder2008逼的重回Ant上了.手生了,写了一个脚本后,重新总结下.参考了官方的文档和网上一些资料.   一.ANT的介 ...

  7. Swagger API接口管理

    介绍         Swagger API框架,用于管理项目中API接口,属当前最流行的API接口管理工具. Swagger功能强大,UI界面漂亮,支持在线测试等!         Swagger包 ...

  8. Web自动化框架LazyUI使用手册(6)--8种控件对应的class,及可对其进行的操作

    概述: 本文详述8种控件对应的class,及可对其进行的操作 回顾: 回顾一下,下文中的工具设计思路部分: http://blog.csdn.net/kaka1121/article/details/ ...

  9. 2014 BDTC 参会有感

    中国大数据技术大会(Big Data Technology Conference,BDTC)是目前国内最具影响.规模最大的大数据领域的技术盛会.大会的前身是Hadoop中国云计算大会(Hadoop i ...

  10. SQL语言四大类

    SQL语言四大类   SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 数据查询语言DQL   数据查询语言DQL基本结构是由SELECT子句, ...