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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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 ;)

时间: 2024-12-02 23:04:08

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

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用Xcode打开之前SpriteBuilder创建的项目,我们现在是时候写点代码了 ;) 创建Brick类头文件 新建一个Brick类,继承自CCSprite,打开Brick.h文件添加初始化类方法: +(instancetype)brickWithColor:(BrickColor)color; 因为我们要产生各种颜色的砖块所以有必要写一个枚举来区分,新建一个

(NO.00004)iOS实现打砖块游戏(六):反弹棒类

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 打砖块游戏另一个要素是反弹棒,我们在这篇类来实现反弹棒类. 创建反弹棒类头文件 在Xcode中新建Stick类,在头文件中添加如下内容: #import "CCSprite.h" @interface Stick : CCSprite +(instancetype)stickNormal; -(void)moveStickTo:(CGPoint)loc

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在回到GameScene.m中,我们所有的碰撞处理就放在该类中.我们首先要搞清楚什么会和什么碰撞.就目前来说,我们先来实现2中碰撞:小球和砖块的碰撞,以及小球和反弹棒的碰撞. 小球和砖块的碰撞:碰撞开始 我们知道一般物理引擎对于碰撞的处理不是一蹴而就的,它分为多个阶段.在Chipmunk中将碰撞按照时间的前后分为开始和后续两个部分;不是在所有的碰撞处理中都要关

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现代码 首先我们在Star.m的spawnStar方法中添加如下代码: case brkColorPoolBlue: star = [Star starWithType:starTypeStickShoot]; break; 接着打开GameScene.m文件,在星星和反弹棒的碰撞处理方法中添加如下处

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本系列来实现一个儿时就很喜欢的打砖块游戏,我记得以前红白机上有一款,画面类似如下: 玩起来的效果和下面类似: 在本篇教程中将利用物理引擎来实现整个游戏,全部素材都由本猫打造,自然不能期望过高. 打砖块游戏3要素:砖块,球和反弹棒.我们来依次制作它们. 制作砖块 首先是砖块,打开Ai,画一个简单的矩形,并设置好阴影效果.砖块的尺寸这里就得想好,我使用的是80x30

(NO.00004)iOS实现打砖块游戏(十一):&amp;quot;一闪一闪亮晶晶,我们都是小星星&amp;quot;

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在一个基本的游戏逻辑已经搭建好了,但是感觉还是缺点什么呢? 蠢蠢的这样一直打下去你有意思吗? 怎能让无聊这样的发生!在本篇博文中,就让我们来添加2个道具:变长和变短星星.但是在创建各种不同功能的道具之前,我们必须先创建出星星来. 创建星星精灵 道具是以星星显示的,这样只要简单的改变星星的颜色就可以区分不同道具了.其实对于每个不同道具应该用更符合其功能的图片来表

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 制作墙体 首先在SpriteBuilder中新建Wall.ccb文件,作为屏幕边界上的墙,阻挡小球或者道具飞出屏幕,制作方法在之前都有详述,所以这里不做过多介绍: 制作游戏关卡 新建Level1.ccb文件,按照实际情况用上面制作的墙体将其包围住,只留最下面为空,以便让物体掉落: 注意上图最下方红色矩形是触发器,后面会提及. 制作游戏场景 在SpriteBuil

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

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

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

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