Cocos2D 2.1开发简单iPhone游戏(3)

本文介绍如何使用Cocos2d-X为iPhone游戏增加不同类型的怪物及多个关卡,通过创建怪物类和关卡管理类来实现游戏难度的逐步提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原文出处

        http://www.raywenderlich.com/25806/harder-monsters-and-more-levels-how-to-make-a-simple-iphone-game-with-cocos2d-2-x-part-3

二、增加游戏难度和关卡

1.更厉害的怪物

   创造两种类型的怪物:一种是弱且快的,一种是强且慢的。

   a.创建Monster类,父类是CCSprite,从CCNode类模版产生

   b.Monster.h

@interface Monster : CCSprite {

}

@property (nonatomic,assign) int hp;//生命值

@property (nonatomic,assign) int minMoveDuration;//最小移动时间

@property (nonatomic,assign) int maxMoveDuration;//最大移动时间


-(id)initWithFile:(NSString *)file hp:(int)hp minMoveDuration:(int)minMoveDuration maxMoveDuration:(int)maxMoveDuration;


@end


@interface WeakAndFastMonster:Monster

@end


@interface StrongAndSlowMonster : Monster

@end


c.Monster.m

@implementation Monster

-(id)initWithFile:(NSString*)file hp:(int)hp minMoveDuration:(int)minMoveDuration maxMoveDuration:(int)maxMoveDuration{

    if((self = [super initWithFile:file])){

        self.hp = hp;

        self.minMoveDuration = minMoveDuration;

        self.maxMoveDuration = maxMoveDuration;

    }

    return self;

}

@end


@implementation WeakAndFastMonster

- (id)init {

    if ((self = [super initWithFile:@"monster.png" hp:1 minMoveDuration:3 maxMoveDuration:5])) {

    }

    return self;

}

@end


@implementation StrongAndSlowMonster

- (id)init {

    if ((self = [super initWithFile:@"monster2.png" hp:3 minMoveDuration:6 maxMoveDuration:12])) {

    }

    return self;

}

@end

d.HelloWorldLayer.m 修改addMonster函数

  将CCSprite * monster = [CCSprite spriteWithFile:@"monster.png"];改为

    Monster *monster = nil;

    if(arc4random()%2==0)

    {

        monster = [[[WeakAndFastMonster alloc] init] autorelease];

    }

    else

    {

        monster = [[[StrongAndSlowMonster alloc] init] autorelease];

    

    }

    //移动速度

    int minDuration = monster.minMoveDuration;//2.0

    int maxDuration = monster.maxMoveDuration;//4.0

e.修改update函数

        BOOL bMonsterHit = FALSE;

        NSMutableArray *monstersToDelete = [[NSMutableArray alloc] init];

        for (Monster *monster in _monsters) {

            

            if (CGRectIntersectsRect(projectile.boundingBox, monster.boundingBox)) {

                bMonsterHit = TRUE;

                monster.hp--;

                if(monster.hp<=0){

                [monstersToDelete addObject:monster];

                }

                break;//一个子弹只能击中一个怪物

            }

        }


      if (bMonsterHit) {

            [projectilesToDelete addObject:projectile];

            [[SimpleAudioEngine sharedEngine] playEffect:@"explosion.caf"];

        }


2.多个关卡

a.创建关卡类,父类NSObject,从Objective-C类模版产生

b.Level.h

@interface Level : NSObject

@property (nonatomic, assign) int levelNum;

@property (nonatomic, assign) float secsPerSpawn;

@property (nonatomic, assign) ccColor4B backgroundColor;


- (id)initWithLevelNum:(int)levelNum secsPerSpawn:(float)secsPerSpawn backgroundColor:(ccColor4B)backgroundColor;

@end

c.Level.m

@implementation Level

- (id)initWithLevelNum:(int)levelNum secsPerSpawn:(float)secsPerSpawn backgroundColor:(ccColor4B)backgroundColor {

    if ((self = [super init])) {

        self.levelNum = levelNum;//第几关

        self.secsPerSpawn = secsPerSpawn;//产生怪物的时间间隔

        self.backgroundColor = backgroundColor;//关卡背景色

    }

    return self;

}

@end

d.关卡管理类,父类NSObject,从Objective-C类模版产生

e.LevelManager.h

@interface LevelManager : NSObject

+(LevelManager*) sharedInstance;

-(Level*)curLevel;

-(void)nextLevel;

-(void)reset;

@end

f.LevelManager.m

@implementation LevelManager

{

    NSArray * _levels;

    int _curLevelIdx;

}


+ (LevelManager *)sharedInstance {

    static dispatch_once_t once;

    static LevelManager * sharedInstance; dispatch_once(&once, ^{

        sharedInstance = [[self alloc] init];

    });

    return sharedInstance;

}


- (id)init {

    if ((self = [super init])) {

        _curLevelIdx = 0;

        Level * level1 = [[[Level alloc] initWithLevelNum:1 secsPerSpawn:2 backgroundColor:ccc4(255, 255, 255, 255)] autorelease];

        Level * level2 = [[[Level alloc] initWithLevelNum:2 secsPerSpawn:1 backgroundColor:ccc4(100, 150, 20, 255)] autorelease];

        _levels = [@[level1, level2] retain];

    }

    return self;

}


- (Level *)curLevel {

    if (_curLevelIdx >= _levels.count) {

        return nil;

    }

    return _levels[_curLevelIdx];

}


- (void)nextLevel {

    _curLevelIdx++;

}


- (void)reset {

    _curLevelIdx = 0;

}


- (void)dealloc {

    [_levels release];

    _levels = nil;

    [super dealloc];

}

@end

g.修改HelloWorldLayer的init函数

 ccColor4B bgColor = [LevelManager sharedInstance].curLevel.backgroundColor;

if( (self=[super initWithColor:bgColor]) ) {

        

        float time = [LevelManager sharedInstance].curLevel.secsPerSpawn;

        

        [self schedule:@selector(gamelogic:) interval:time];

h.GameOverLayer.m修改initWithWon

 NSString * message;

        if (won) {

            [[LevelManager sharedInstance] nextLevel];

            Level * curLevel = [[LevelManager sharedInstance] curLevel];

            if(curLevel){

                message = [NSString stringWithFormat:@"Get ready for level %d!",curLevel.levelNum];

            }else{

            message = @"You Won!";

            }

        } else {

            message = @"You Lose :[";

            [[LevelManager sharedInstance] reset];

        }


3.结束

  最后的代码final sample project,后面还有其他游戏如塔防游戏等的介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值