標籤:
大熊貓豬·侯佩原創或翻譯作品.歡迎轉載,轉載請註明出處.
如果覺得寫的不好請告訴我,如果覺得不錯請多多支援點贊.謝謝! hopy ;)
關卡遊戲的精髓都集中在遊戲的關卡裡,其中包含了遊戲的所有要素,至於關卡如何管理這些要素這得根據不同遊戲想要的效果來決定.我們開始先從在關卡中建立磚塊,小球和反彈棒3個元素做起.
建立關卡類
在Xcode中建立Level類,繼承於CCNode類.修改標頭檔為如下內容:
#import "CCNode.h"@interface Level : CCNode-(void)removeFromBricks:(id)brick;-(CGPoint)ballPosition;@end
Level要維護一個單獨的列表,用來儲存其中的磚塊執行個體,當在Level外部刪除磚塊時我們需要用removeFromBricks方法來保證brick被正確刪除.後一個方法看名知其意,就是取得小球的位置,這個在後面會用到.
實現關卡的初始化方法
開啟Level.m檔案,添加一個初始化方法:
-(void)didLoadFromCCB{ _bricks = [NSMutableArray array]; Brick *brick = [Brick brickWithColor:brkColorBlack]; _brickHeight = brick.contentSize.height; _brickWidth = brick.contentSize.width; _viewSize = [CCDirector sharedDirector].viewSize; [self initBricks]; [self initStick];}
我們首先建立了儲存磚塊的_bricks數組,取得在關卡中後面會頻繁用到的一些變數,然後就是初始化磚塊和反彈棒的方法.你可能會奇怪怎麼少了初始化小球的方法?這裡要說明一下,因為在初始化小球的方法中要調整小球的力矩,所以放在這裡太早,這時小球的物理對象還未準備好,我們把它放到onEnter方法中去:
-(void)onEnter{ [super onEnter]; [self initBall];}
磚塊的初始化
我們先看磚塊的初始化:
-(void)initBricks{ Brick *brick = [Brick brickWithColor:brkColorBlack]; for (int row = 0; row < 8; row++) { [self updateCurrentBrickColor:1]; for (int col = 0; col < 4; col++) { brick = [Brick brickWithColor:_currentBrickColor]; brick.position = ccp(col * (_brickWidth - BRICK_SHADOW_OFFSET_X), MAX_BRICK_HIGHT - row * (_brickHeight - BRICK_SHADOW_OFFSET_Y)); [_physicsWorld addChild:brick]; [_bricks addObject:brick]; } }}
以上代碼從螢幕頂部開始依次繪製8行,每行4塊磚塊,同時將每塊磚塊添加到物理世界和_bricks數組中.
反彈棒的初始化
-(void)initStick{ _stick = [Stick stickNormal]; _stick.position = ccp(_viewSize.width/2, STICK_Y); [_physicsWorld addChild:_stick];}
代碼很簡單,建立一個反彈棒然後添加到物理世界中.
小球的初始化
最後是小球的初始化工作:
//在Level中初始化小球並給其一個隨機的衝力.(不希望小球直接垂直落在反彈棒上)-(void)initBall{ _ball = (CCSprite*)[CCBReader load:@"Elements/Ball"]; NSAssert(_ball, @"ball must not nil"); _ball.name = @"ball"; _ball.position = ccp(_viewSize.width/2, BALL_Y); [_physicsWorld addChild:_ball]; CCPhysicsBody *physBall = _ball.physicsBody; CGPoint velocity = physBall.velocity; NSInteger neg = arc4random_uniform(2); if (neg == 0) { neg = -1; } NSInteger rndX = arc4random_uniform(100)+100; velocity.x = neg * rndX; [physBall applyAngularImpulse:10]; [physBall applyImpulse:velocity];}
在以上方法中建立了一個小球,我們不希望其垂直掉落下來,所以隨機給其賦予一個衝力,讓其略活潑點的掉落下來 ;)
現在編譯和運行遊戲,現在的遊戲剛進入的效果如下所示:
一個基本的關卡架構就基本搭好了,下篇我們來實現遊戲中的碰撞處理.see you ;)
(NO.00004)iOS實現打磚塊遊戲(七):關卡類的實現