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

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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实现打砖块游戏(十):砖块!更多的砖块!的更多相关文章

  1. (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现 ...

  2. (NO.00004)iOS实现打砖块游戏(十五):导弹发射道具的实现(上)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇中我们实现了3球道具,但是好像还是不过瘾,如果能让反弹棒更 ...

  3. (NO.00004)iOS实现打砖块游戏(十四):3球道具的实现

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 反弹棒变化道具实现前面已经介绍过了,我们下面可以在小球上做些文章 ...

  4. (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 通用的星星类已经完成了,下面我们来实现具体的变长和缩短道具. 变 ...

  5. (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇博文介绍了物理对象中小球与砖块的碰撞处理,在这一篇中我们再 ...

  6. (NO.00004)iOS实现打砖块游戏(一):素材的制作

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本系列来实现一个儿时就很喜欢的打砖块游戏,我记得以前红白机上有一 ...

  7. (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在回到GameScene.m中,我们所有的碰撞处理就放在该类中 ...

  8. (NO.00004)iOS实现打砖块游戏(四):砖块类的实现

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用Xcode打开之前SpriteBuilder创建的项目,我们现 ...

  9. (NO.00004)iOS实现打砖块游戏(三):游戏主场景和砖块

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 制作墙体 首先在SpriteBuilder中新建Wall.ccb ...

随机推荐

  1. 基于Spark环境对比Python和Scala语言利弊

    在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点. 本文翻译自  https://www.dezyre.com/article/Scala-vs-Py ...

  2. 关于导入excel问题

    关于导入excel问题: 在VS中可以导入,部署在IIS上无法导入的原因: 1.可能部署IIS上发布的文件设置为只读,没有写入权限.解决方法为:设置程序发布的文件夹,添加写入权限,以及asp.net ...

  3. candy(动态规划)

    题目描述 There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  4. SpringMVC 环境搭建(HelloWorld)

    SpringMVC 入门案例 环境 * springMVC * web 构建文件目录结构 修改dispatcher-servlet.xml文件 修改web.xml

  5. Servlet生命周期与工作原理(转载)

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  6. 浏览器本地下拉框查询选择js

    首先需要引用jquery-1.7.2.js. 页面下拉框有对应的数据,此下拉框的查询将不与服务器交互.本地下拉框查询.暂不支持通过键盘上下按键和enter键控制 // JavaScript Docum ...

  7. 最小费用最大流(luogu P3381 【模板】最小费用最大流)

    题目链接 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S. ...

  8. Docker 镜像

    Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. D ...

  9. 用Netty解析Redis网络协议

    用Netty解析Redis网络协议 根据Redis官方文档的介绍,学习了一下Redis网络通信协议.然后偶然在GitHub上发现了个用Netty实现的Redis服务器,很有趣,于是就动手实现了一下! ...

  10. Common-used commands in Docker

    1. Start running a image in background mode docker run -it -d <image>:<tag> e.g. docker ...