關卡游戲的精髓都集中在游戲的關卡裡,其中包含了游戲的所有要素,至於關卡如何管理這些要素這得根據不同游戲想要的效果來決定.我們開始先從在關卡中建立磚塊,小球和反彈棒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 ;)