(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,我们已经实现了我们想要的添加砖块的效果:

时间: 2025-01-02 15:16:49

(NO.00004)iOS实现打砖块游戏(十):砖块!更多的砖块!的相关文章

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇中我们实现了3球道具,但是好像还是不过瘾,如果能让反弹棒更具"攻击性"就好了,那么本篇中我们就让它发射导弹直接击毁砖块吧! 导弹道具的功能 我们要实现如下功能: 反弹棒接触到导弹道具星后"长出"一根炮管 该炮管定时向前方发射导弹 导弹碰到砖块则将其击毁,否则飞出屏幕自动销毁 一定时间后炮管消失,导弹发射也随之停止 让棒棒上长出

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 反弹棒变化道具实现前面已经介绍过了,我们下面可以在小球上做些文章,实现一个道具可以变出更多的小球出来. 我们称之为3球道具:当反弹棒碰到该道具时,小球变为3枚,接下来你尽可能保持这些小球不掉落,这样你可以得到比1个球时更多地分数. 打开Xcode,在Star.m中的spawnStar方法条件中加入新的分支: case brkColorPurple: star =

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 通用的星星类已经完成了,下面我们来实现具体的变长和缩短道具. 变长的反弹棒 我们想实现如下功能:在掉落变长星之后,如果反弹棒接到它,则使反弹棒的长度变为原先的2倍. 看似很简单,但实际有一个问题.你不能仅仅延长反弹棒精灵纹理的长度,因为你在这个游戏中使用的是物理引擎,反弹棒的物理对象的大小是不可以在游戏运行中随意变化的. 所以我们需要想办法延长反弹棒的物理大小,

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇博文介绍了物理对象中小球与砖块的碰撞处理,在这一篇中我们再来看一下小球与反弹棒碰撞发生的那点事 ;) 小球与反弹棒开始碰撞 同样我们在碰撞中也要调整小球的力矩,所以也要分开处理,首先是碰撞开始时的处理: -(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair ball:(CCNode *)

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 准备缩短反弹棒素材 和上一篇类似,我们如法炮制一张缩短后反弹棒的素材. 打开SpriteBuilder,新建StickShorter.ccb文件,按下图绘制其sprite帧和物理对象: 注意,在Ai中缩小和放大原来反弹棒的图片时,只要沿X轴一个方向放大即可,否则在Y轴方向也会变大,这就不是我们想要的了. 创建缩短道具星 我们用红色的星星表示缩短道具,所以spaw

(NO.00004)iOS实现打砖块游戏(七):关卡类的实现

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 关卡游戏的精髓都集中在游戏的关卡里,其中包含了游戏的所有要素,至于关卡如何管理这些要素这得根据不同游戏想要的效果来决定.我们开始先从在关卡中建立砖块,小球和反弹棒3个元素做起. 创建关卡类 在Xcode中创建Level类,继承于CCNode类.修改头文件为如下内容: #import "CCNode.h" @interface Level : CCNod

(NO.00004)iOS实现打砖块游戏(五):游戏场景类

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 创建游戏场景类头文件 在Xcode创建新GameScene类,继承于CCNode,将其头文件替换为以下内容: #import "CCNode.h" @class Stick; @interface GameScene : CCNode <CCPhysicsCollisionDelegate> //读取GameScene中Level中的反弹棒

(NO.00004)iOS实现打砖块游戏(二):实现游戏主界面动画

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一个内容不错的游戏也要一个好的包装.玩家进入游戏时第一眼看到的是将是游戏的主界面,如何生动的展示一个具有吸引力的界面就是本篇的主题.当然这里无法和商业游戏的主界面相比的,只是展示一下不用写什么代码,也可以把主界面做的比较活泼. 在主界面上添加静态元素 打开SpriteBuilder中的MainScene.ccb文件,将原有控件统统删掉,这时场景变得黑漆漆的一片.

从零开始学ios开发(十二):Table Views(中)UITableViewCell定制

我们继续学习Table View的内容,这次主要是针对UITableViewCell,在前一篇的例子中我们已经使用过UITableViewCell,一个默认的UITableViewCell包含imageView.textLabel.detailTextLabel等属性,但是很多时候这些默认的属性并不能满足需要,其实更多的时候我们想自己制定UITableViewCell的内容,这篇学习的就是制定自己的UITableViewCell. UITableViewCell继承自UIView,因此它可以加载