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

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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. bzoj2338[HNOI2011]数矩形 计算几何

    2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1535  Solved: 693[Submit][Status ...

  2. SpringCloud学习之Ribbon

    一.负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服务器上,每台服 ...

  3. Spring系列之装配Bean

    Spring 的三种装配Bean的方式 组件扫描+自动装配(隐式) 通过Java config装配bean(显示) 通过XML装配bean(显示) 一.组件扫描+自动装配(隐式配置) 组件扫描: Sp ...

  4. face-alignment:用 pytorch 实现的 2D 和 3D 人脸对齐库

    使用世界上最准确的面对齐网络从 Python 检测面部地标,能够在2D和3D坐标中检测点. 项目地址:https://github.com/1adrianb/face-alignment 作者: 阿德 ...

  5. Elasticsearch 学习(一):入门

    一.概念 Elasticsearch 是一个实时分布式搜索和分析引擎.它用于全文搜索.结构化搜索.分析以及将这三者混合使用. 维基百科.英国卫报.StackOverflow.Github 等公司都在使 ...

  6. 博客迁移,新地址:bfsan.github.io

    博客的新内容会在新地址发布(暂时),后期可能会考虑做一个整合同步.

  7. Jenkins持续集成环境, 如何自定义 maven 仓库

    最后的解决方法: job-->configure-->Build-->Goals and options: clean package -Dmaven.repo.local=D:\d ...

  8. kibana使用

    最近,被老大叫写一个kibana的使用方法给所有人用. 注意的一点: 能不用空格表示OR或者AND就不用空格表示,因为要么全用要么全部不用,否则会因为解析搜索同级的时候,若出现空格和OR,会冲突覆盖意 ...

  9. thymeleaf:局部变量 th:with

    当th:with被处理,firstPer变量创建一个局部变量和变量添加到map自上下文,以便它是用于评估和其他上下文中声明的变量从开始,但只有包含< div >标记的范围内. <di ...

  10. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...