(NO.00004)iOS实现打砖块游戏(十):砖块!更多的砖块!
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
到目前为止游戏基本可玩,但是砖块数量是不变的,等玩家打光所有的砖块就会觉得没啥意思了,所以我们必须想办法添加更多的砖块进来.
创建循环保持颜色的实例变量
我们想要按行添加砖块,为了美观,每行砖块的颜色应该都是不同的.所以我们先来建立一个保持当前砖块颜色的实例变量:
NSInteger _currentBrickColor;
当然还有一个更新其值的方法:
-(void)updateCurrentBrickColor:(NSInteger)incVal{
_currentBrickColor += incVal;
_currentBrickColor %= brkColorMax;
if (_currentBrickColor == brkColorUnknown) {
_currentBrickColor++;
}
}
很简单,就是在所有brick颜色中不断循环着.
在指定Y轴位置创建一行砖块
接下来我们写一个在指定Y坐标高度位置创建一行砖块的帮助方法:
//在rowY位置创建新的一行砖块
-(void)createOneBrickRow:(NSInteger)rowY{
[self updateCurrentBrickColor:1];
[self createOneBrickRow:rowY withColor:_currentBrickColor];
}
其中调用了另一个方法,我们马上实现它:
//在rowY位置用指定color创建新的一行砖块
-(void)createOneBrickRow:(NSInteger)rowY withColor:(BrickColor)color{
Brick *brick;
//如果rowY为0,则从屏幕砖块最高可码到的高度开始创建
if (rowY == 0) {
rowY = MAX_BRICK_HIGHT;
}
for (int i = 0; i < 4; i++) {
brick = [Brick brickWithColor:color];
brick.position = ccp(i * (_brickWidth - BRICK_SHADOW_OFFSET_X), rowY);
[_physicsWorld addChild:brick];
//将新加的砖块放到_bricks数组的头部
[_bricks insertObject:brick atIndex:0];
}
}
一般的,我们在指定的rowY位置建立一行砖块,但可能出现这么一种情况:当前所有砖块都被打光了,屏幕中没有砖块了.这时我们就从屏幕最高的位置建立一行砖块.
下沉一行砖
如果当前砖块保持不动,那么新的砖块就无法添加进来.所以我们得想办法让砖块向下移动,以便在空出的位置新添加一行.
我们先实现下沉一块砖的方法,借此再实现下沉一行砖块的方法.
首先是下沉一块砖:
//下沉一个指定的砖块
-(void)sinkOneBrick:(Brick*)brick{
CCPhysicsBody *physBody = brick.physicsBody;
physBody.type = CCPhysicsBodyTypeDynamic;
CGPoint brickPosition = brick.position;
brick.position = ccp(brickPosition.x,brickPosition.y - (_brickHeight - BRICK_SHADOW_OFFSET_Y));
[self scheduleBlock:^(CCTimer *timer){
physBody.type = CCPhysicsBodyTypeKinematic;
} delay:0];
}
上面代码中,我们先是将砖块类型改为动态,最后又恢复为混合态.这是因为避免静态物理对象在移动时碰到动态物体时将其弹开的不恰当行为.
有了上面的方法,下沉一行砖块就好实现了:
//将Level中的所有砖块下沉step级,然后在上方创建新的step行砖块.
-(void)sinkBricksAndCreateNewRows:(NSInteger)step{
//保存当前Level中最高行砖块的Y值
NSInteger highestRowBrickY = 0;
for (int i = 0; i < step; i++) {
for (Brick *brick in _bricks) {
if (highestRowBrickY == 0) {
highestRowBrickY = brick.position.y;
}
[self sinkOneBrick:brick];
}
//在原来最高的那一行中创建新的一行砖块
[self createOneBrickRow:highestRowBrickY];
highestRowBrickY = 0;
}
}
以上代码完成了下沉一行砖块,然后在空出的位置新建一行砖块的功能.
定时下沉砖块
好了,最后写一个定时器方法,在指定间隔后调用以上方法即可:
-(void)doWithBricks{
[self sinkBricksAndCreateNewRows:1];
}
然后在初始化方法中调用该定时器方法:
[self schedule:@selector(doWithBricks) interval:3];
现在编译运行app,我们已经实现了我们想要的添加砖块的效果:
(NO.00004)iOS实现打砖块游戏(十):砖块!更多的砖块!的更多相关文章
- (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现 ...
- (NO.00004)iOS实现打砖块游戏(十五):导弹发射道具的实现(上)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇中我们实现了3球道具,但是好像还是不过瘾,如果能让反弹棒更 ...
- (NO.00004)iOS实现打砖块游戏(十四):3球道具的实现
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 反弹棒变化道具实现前面已经介绍过了,我们下面可以在小球上做些文章 ...
- (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 通用的星星类已经完成了,下面我们来实现具体的变长和缩短道具. 变 ...
- (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇博文介绍了物理对象中小球与砖块的碰撞处理,在这一篇中我们再 ...
- (NO.00004)iOS实现打砖块游戏(一):素材的制作
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本系列来实现一个儿时就很喜欢的打砖块游戏,我记得以前红白机上有一 ...
- (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在回到GameScene.m中,我们所有的碰撞处理就放在该类中 ...
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用Xcode打开之前SpriteBuilder创建的项目,我们现 ...
- (NO.00004)iOS实现打砖块游戏(三):游戏主场景和砖块
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 制作墙体 首先在SpriteBuilder中新建Wall.ccb ...
随机推荐
- [bzoj1143][CTSC2008]祭祀
题意:给定一个n个点m条边的有向无环图,你要选出最多的点,并且满足任意两点之间都不存在通路.2)输出每个点选了它之后还是否有最优解. n<=100 m<=1000 题解:每个点拆两个点 ...
- linux最常用的基本命令
//**********************对应linux centos常用命令 **************************/// 安装centos6.6带有gnome桌面 ctrl+c ...
- 5步做一个 TensorFlow 聊天机器人:DeepQA
项目截图: 实测截图: 一步一步教程: 1.下载这个项目: https://github.com/Conchylicultor/DeepQA 2.下载训练好的模型: https://drive.goo ...
- 如何用Netty实现一个轻量级的HTTP代理服务器
为什么会想通过Netty构建一个HTTP代理服务器?这也是笔者发表这篇文章的目的所在. 其主要还是源于解决在日常开发测试过程中,一直困扰测试同学很久的一个问题,现在我就来具体阐述一下这个问题. 在日常 ...
- JAVA学习总结-多线程基础:
参考书籍:疯狂JAVA讲义 1.进程和线程; 进程是处于运行过程中的程序;并且具有一定的独立功能;进程是系统进行系统资源分配和调度的一个独立单位. 一般而言,进程包括以下三个特征: 独立性:进程是系统 ...
- Redis持久化的两种方式(RDB和AOF)
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储 ...
- 去除html标记和替换script标记
1: /// <summary> 2: /// 去除HTML标记 3: /// </summary> 4: /// <param name="NoHTML&qu ...
- c++ Lambda表达式待修改
C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问. Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lam ...
- jQuery 效果 – 隐藏和显示
在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() 方法. 隐藏.显示.切换,滑动 ...
- docker环境 mysql读写分离 mycat maxscale
#mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...