反彈棒變化道具實現前面已經介紹過了,我們下面可以在小球上做些文章,實現一個道具可以變出更多的小球出來.
我們稱之為3球道具:當反彈棒碰到該道具時,小球變為3枚,接下來你盡可能保持這些小球不掉落,這樣你可以得到比1個球時更多地分數.
打開Xcode,在Star.m中的spawnStar方法條件中加入新的分支:
case brkColorPurple:
star = [Star starWithType:starTypeThreeBalls];
break;
因為在Star.m的方法中需要知道當前場景中小球的狀態,所以先在GameScene.h接口中添加2個新的方法:
-(void)addBall:(CCSprite*)ball;
-(NSInteger)currentBallsCount;
回到GameScene.m中,擴展代碼增加一個新的實例變量,用來表示當前所有小球:
NSMutableArray *_balls;
接著我們實現上面新加的2個方法:
//在GameScene中添加小球,小球的位置必須已經被正確設置
-(void)addBall:(CCSprite*)ball{
@synchronized(self){
[_physicsWorld addChild:ball];
[_balls addObject:ball];
}
}
-(NSInteger)currentBallsCount{
@synchronized(self){
return _balls.count;
}
}
注意方法中都設置了同步,因為讀取時可能發生修改,如果不加同步,app可能會發生crash!
再回到Star.m中,我們添加關鍵的道具功能方法doThreeBalls:
+(void)doThreeBalls:(CGPoint)ballLocation{
GameScene *gameScene = [GameScene sharedGameScene];
if ([gameScene currentBallsCount] != 1) {
return;
}
CCSprite *ball2 = (CCSprite*)[CCBReader load:@Elements/Ball];
ball2.position = ballLocation;
[gameScene addBall:ball2];
CCSprite *ball3 = (CCSprite*)[CCBReader load:@Elements/Ball];
ball3.position = ballLocation;
[gameScene addBall:ball3];
}
代碼首先檢查當前場景中有多少個小球,如果多余1個則直接返回,就是說該道具只能在只有1枚小球時發揮作用.
接著創建另外2個小球,通過之前定義的addBall方法,把它們添加到場景中去.
最後在GameScene.m的碰撞處理中增加新選擇分支:
case starTypeThreeBalls:
@synchronized(self){
if ([self currentBallsCount] >= 1) {
[self scheduleBlock:^(CCTimer *timer){
[Star doThreeBalls:((CCSprite*)_balls[0]).position];
} delay:0];
}
}
break;
現在編譯連接app,運行效果如下: