博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(NO.00004)iOS实现打砖块游戏(七):关卡类的实现
阅读量:5947 次
发布时间:2019-06-19

本文共 2471 字,大约阅读时间需要 8 分钟。

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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 ;)

你可能感兴趣的文章
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>
java 视频播放 多人及时弹幕技术 代码生成器 websocket springmvc mybatis SSM
查看>>
Activiti6.0,spring5,SSM,工作流引擎,OA
查看>>
使用Tooltip会出现一个问题,如果行上出现复选框
查看>>
禁止浏览器缓存js
查看>>
【Redis】安装PHP的redis驱动(二)
查看>>
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
C++中一些类和数据结构的大小的总结
查看>>