首先判断问题出现在Star的类方法doStickShorterWork中,于是逐步分词注释代码,最后剩下如下代码: +(void)doStickShorterWork:(Stick *)stick{ GameScene *gameScene = [GameScene sharedGameScene]; CCPhysicsNode *physicsWorld = (CCPhysicsNode*)stick.parent; @synchronized(gameScene){ if ([stick.n…
最近在写的BrickHit游戏App中出现了一个比较头疼的问题. 该问题很难用常规手段调试,因为其发生看起来貌似是随机的. 我想在这里将这个问题的现象和解决过程详细的记录下来,一来避免其他童鞋走弯路,二来自己以后也可以参考. 所谓我看到的僵尸物理对象,我的定义是打开物理node调试后,可以在屏幕上看到该对象,该对象没有实际外形,我把它理解为没有SpriteFrame.但实际遍历物理node的子对象根本找不到该物理对象. 可能表述不是很清楚,简单来说,就是一个不在物理node中的物理对象,没有外观…
,因为将反弹棒变长和缩短的代码是类似的所以我们只看一个即可,就让我们详细看看缩短的方法吧. +(void)doStickShorterWork:(Stick *)stick{ GameScene *gameScene = [GameScene sharedGameScene]; CCPhysicsNode *physicsWorld = (CCPhysicsNode*)stick.parent; @synchronized(gameScene){ if ([stick.name isEqualT…
如第一篇文章中图片所示,该游戏是一个弹球游戏. 玩法很简单,屏幕底部有一个反弹棒,用来确保小球不掉出屏幕同时反弹小球撞击屏幕上方的砖块. 玩家可以触摸屏幕来左右移动反弹棒. 等等!还不是这么简单,当小球击中特殊的砖块时会掉出特定的道具五角星.用反弹棒接触道具会有特殊的效果;目前有2种效果: 1.红色的五角星反弹棒会变长10秒钟 2.黑色的五角星反弹棒会缩短10秒钟 反弹棒是一个附有物理对象的节点(Node),在SpriteBuilder中是不可以放大或缩小一个附带物理对象的Node的.为了实现反…
如何解决? 等到碰撞方法返回后在调用Star类方法.碰撞方法在物理引擎的一帧内应该会处理完成,在下一帧里碰撞回调已经结束.所以我们将Star类方法的调用放到下一帧里执行即可,代码如下: //... @synchronized(self){ [self scheduleBlock:^(CCTimer *timer){ [Star doStickLongerWork:self.stickInGameScene]; } delay:0]; } //... 再次反复运行App没有在出现僵尸对象了,初步验…
既然出现了这个问题下面就是如何找到原因. 因为该问题不是每次都出现,偶尔反弹棒碰到五角星时才会多出一个僵尸棒,现象比较随机,较难悉知具体原因. 有时多次触碰又没有出现问题,有时短时间内每次触碰都出现问题.开始我以为是stick自身从parent删除时多次重入导致.于是希望定时将多余的stick删除掉,在GameScene中每隔5秒调用一次: -(void)clearInvalidSticks{ @synchronized(self){ NSInteger stickCount = 0; for…
首先是触摸移动反弹棒的代码: -(void)touchMoved:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch]; @synchronized(self){ [self.stickInGameScene moveStickTo:location]; } } 简单起见,具体调用方法实现不一一给出了,大家可…
接上一篇,我们看看五角星和反弹棒碰撞时的代码: -(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode *)star stick:(CCNode *)stick{ Star *starTmp = (Star*)star; //star形状是五角星,可能会在短时间内多次发生碰撞;但在star已经由第一次碰撞时删除掉从而导致star为nil //所以这里要确保star不为nil. if (!starTmp)…
在创建Node的物理对象后,默认情况下物理对象和Node的实际边界相应的非常好,由于此时Node的默认锚点是当中心位置即(0.5,0.5),只是假设我们改变了Node的锚点,就会发现其物理边界还是保持原来的位置,这可不是我们想要的结果: let bouncer = SKSpriteNode(imageNamed: "bouncer") bouncer.anchorPoint = CGPoint(x: 0.5, y: 0) bouncer.position = CGPoint(x: 0,…
直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 应用jQuery的扩展可以解决这个问题. $(document).ready(function(){ $.extend({  show:function(){   alert("ready");  }});setInterval("show()",3000);}); 方法2. 指定定时执行的函数时不要使用引号和括号.  $(function(){function show(){   al…