(NO.00004)iOS实现打砖块游戏(七):关卡类的实现
2015-11-29 09:38
537 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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实现打砖块游戏(六):反弹棒类
- (NO.00004)iOS实现打砖块游戏(六):反弹棒类
- (NO.00004)iOS实现打砖块游戏(六):反弹棒类
- iOS MRC手动内存管理 心得体会
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
- iOS 引入库工程遇到的问题
- iOS9 - 采用3D Touch
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现
- iOS开发>学无止境 - NSLocale的重要性和用法简介
- AJ学IOS 之第三方登录友盟实现
- AJ学IOS之安装cocoapods
- AJ学IOS之去除服务器返回数据中的html标签,去除指定字符串,替换字符串
- iOS开发>学无止境 - Cell 里的视图控制器
- iOS开发>学无止境 - 使用MVC模式帮ViewController瘦身
- AJ学IOS 之ipad开发Popover的调色板应用_popover显示后其他控件仍然能进行交互
- AJ学IOS 之ipad开发Popover的基本使用