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

最近在写的BrickHit游戏App中出现了一个比较头疼的问题.

该问题很难用常规手段调试,因为其发生看起来貌似是随机的.

我想在这里将这个问题的现象和解决过程详细的记录下来,一来避免其他童鞋走弯路,二来自己以后也可以参考.

所谓我看到的僵尸物理对象,我的定义是打开物理node调试后,可以在屏幕上看到该对象,该对象没有实际外形,我把它理解为没有SpriteFrame.但实际遍历物理node的子对象根本找不到该物理对象.

可能表述不是很清楚,简单来说,就是一个不在物理node中的物理对象,没有外观,遍历不到也无法访问,更别说删除了.

如上图,注意屏幕下方有2个反弹棒,左边那个是正常的棒,而右边那支就是在游戏中随机出现的”僵尸棒”

至于游戏的逻辑如何,我们在下一篇中说明.

时间: 2024-09-20 04:09:48

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

Chipmunk僵尸物理对象的出现和解决(七)

首先判断问题出现在Star的类方法doStickShorterWork中,于是逐步分词注释代码,最后剩下如下代码: +(void)doStickShorterWork:(Stick *)stick{ GameScene *gameScene = [GameScene sharedGameScene]; CCPhysicsNode *physicsWorld = (CCPhysicsNode*)stick.parent; @synchronized(gameScene){ if ([stick.n

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

,因为将反弹棒变长和缩短的代码是类似的所以我们只看一个即可,就让我们详细看看缩短的方法吧. +(void)doStickShorterWork:(Stick *)stick{ GameScene *gameScene = [GameScene sharedGameScene]; CCPhysicsNode *physicsWorld = (CCPhysicsNode*)stick.parent; @synchronized(gameScene){ if ([stick.name isEqualT

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

如第一篇文章中图片所示,该游戏是一个弹球游戏. 玩法很简单,屏幕底部有一个反弹棒,用来确保小球不掉出屏幕同时反弹小球撞击屏幕上方的砖块. 玩家可以触摸屏幕来左右移动反弹棒. 等等!还不是这么简单,当小球击中特殊的砖块时会掉出特定的道具五角星.用反弹棒接触道具会有特殊的效果;目前有2种效果: 1.红色的五角星反弹棒会变长10秒钟 2.黑色的五角星反弹棒会缩短10秒钟 反弹棒是一个附有物理对象的节点(Node),在SpriteBuilder中是不可以放大或缩小一个附带物理对象的Node的.为了实现反

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

如何解决? 等到碰撞方法返回后在调用Star类方法.碰撞方法在物理引擎的一帧内应该会处理完成,在下一帧里碰撞回调已经结束.所以我们将Star类方法的调用放到下一帧里执行即可,代码如下: //... @synchronized(self){ [self scheduleBlock:^(CCTimer *timer){ [Star doStickLongerWork:self.stickInGameScene]; } delay:0]; } //... 再次反复运行App没有在出现僵尸对象了,初步验

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

既然出现了这个问题下面就是如何找到原因. 因为该问题不是每次都出现,偶尔反弹棒碰到五角星时才会多出一个僵尸棒,现象比较随机,较难悉知具体原因. 有时多次触碰又没有出现问题,有时短时间内每次触碰都出现问题.开始我以为是stick自身从parent删除时多次重入导致.于是希望定时将多余的stick删除掉,在GameScene中每隔5秒调用一次: -(void)clearInvalidSticks{ @synchronized(self){ NSInteger stickCount = 0; for

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

首先是触摸移动反弹棒的代码: -(void)touchMoved:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch]; @synchronized(self){ [self.stickInGameScene moveStickTo:location]; } } 简单起见,具体调用方法实现不一一给出了,大家可

js为空或不是对象问题的快速解决方法

 这篇文章主要介绍了js为空或不是对象问题的快速解决方法.需要的朋友可以过来参考下,希望对大家有所帮助 1.加了个参数<script language="javascript" defer="defer">   2. 'null'为空或不是对象:   <script type="text/javascript"> 里面加个defer=true属性试试看,   即:<script type="text/jav

新中新二代身份证阅读器ocx控件使用提示对象不支持怎么解决?

问题描述 新中新二代身份证阅读器ocx控件使用提示对象不支持怎么解决? 100C 项目需要在客户端浏览器中使用新中新二代身份证阅读器读取身份证信息,使用官方提供的ocx控件,并且在自己本机上可以读取,但是在客户机上使用时在调用控件的方法的时候提示对象不支持XXX方法图片说明官方提供的驱动什么的都装上了,好像还是不行,跪求解释....官方的demo也跑不通图片说明 解决方案 你机器上可以读取,那你的机器和客户机有什么区别吗??? 解决方案二: 都是window7 64位,都是IE9, 官方提供的控

SQL对象名无效的解决方法

sql|解决|对象名 产生SQL对象名无效的问题大多原因是由于数据迁移导致的,下面我们给出解决方法. 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备份中直接恢复.但是,此时会出现问题,这里说明几种常见问题的解决方法.一.孤立用户的问题比如,以前的数据库的很多表是用户test建立的,但是当我们恢复数据库后,test用户此时就成了孤立用户,没有与之对应的登陆用户名,哪怕你建立了一个test登录用户名,而且是以前的用户密码,用该用户登录后同样