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

,因为将反弹棒变长和缩短的代码是类似的所以我们只看一个即可,就让我们详细看看缩短的方法吧.

+(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];
        //stickShorter.visible = NO;
        gameScene.stickInGameScene = stickShorter;

        CCSprite *stickNode = (CCSprite*)[CCBReader load:@"Elements/StickNode"];
        stickNode.position = stickShorter.position;
        [gameScene addChild:stickNode z:50];

        CCActionScaleTo *shorterAction = [CCActionScaleTo actionWithDuration:0.4f scaleX:0.5f scaleY:1.0f];
        CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{
            [stickNode removeFromParent];
            stickShorter.visible = YES;
        }];
            CCActionSequence *seq = [CCActionSequence actions:shorterAction,blk,nil];
            [stickNode runAction:seq];
    }

    [stickShorter scheduleBlock:^(CCTimer *timer){
        @synchronized(gameScene){
            Stick *stickNormal = [Stick stickNormal];
            stickNormal.position = stickShorter.position;
            [stickShorter removeFromParent];
            stickShorter = nil;
            [physicsWorld addChild:stickNormal];
            gameScene.stickInGameScene = stickNormal;
        }
    } delay:10];
}

代码比较长,我们依次看一下.

首先取得gameScene和物理世界对象的实例.

如果当前stick已经是短棒了,不能再变短了,所以直接退出方法
如果当前stick是长棒,则删除stick,新建一个正常长度的stick.相当于长棒碰到变短五角星时恢复至正常尺寸,然后退出方法.

否则当前应该是正常尺寸的stick需要将其变短,具体做法为:

1.首先在原来stick位置新建一个短的stick,但将其设置为不可见,因为还要有一个变短的动画效果;
2.建立一个不带物理对象的stick节点,并执行变短的动画;
3.在动画结束时将自身删除同时将短stick设为可见.注意动画时间需要适中,既不能太长也不能过短.这个将在iOS游戏开发系列博文中详述.
4.给短的stick添加一个延时10秒调用的block,在10秒后将其删除,在原位置新建一个正常尺寸的stick.相当于10秒后恢复stick正常的尺寸.

以上就是相关的功能代码了.

编译运行App.在游戏运行时偶尔会在屏幕中产生”僵尸棒”,前面说了在物理世界中找不到该对象,更无从删除.

时间: 2024-09-13 17:52:01

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

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

最近在写的BrickHit游戏App中出现了一个比较头疼的问题. 该问题很难用常规手段调试,因为其发生看起来貌似是随机的. 我想在这里将这个问题的现象和解决过程详细的记录下来,一来避免其他童鞋走弯路,二来自己以后也可以参考. 所谓我看到的僵尸物理对象,我的定义是打开物理node调试后,可以在屏幕上看到该对象,该对象没有实际外形,我把它理解为没有SpriteFrame.但实际遍历物理node的子对象根本找不到该物理对象. 可能表述不是很清楚,简单来说,就是一个不在物理node中的物理对象,没有外观

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

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

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, 官方提供的控

【DATAGUARD】物理dg的switchover切换(五)

[DATAGUARD]物理dg的switchover切换(五) 1.1  BLOG文档结构图     1.2  前言部分   1.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 物理dg的switchover切换演练过程 ② 物理dg管理和维护的一些sql   注意:本篇BLOG中代码部分需要特别关注的地方我都用黄色背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大