,因为将反弹棒变长和缩短的代码是类似的所以我们只看一个即可,就让我们详细看看缩短的方法吧.
+(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.在游戏运行时偶尔会在屏幕中产生”僵尸棒”,前面说了在物理世界中找不到该对象,更无从删除.