一、原文出处
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,后面还有其他游戏如塔防游戏等的介绍。