如何设计开发iPhone塔防游戏7-连绵不绝2

本文由eseedo(泰然骷髅会成员)翻译,泰然授权转载,转载请通知eseedo(http://blog.sina.com.cn/eseedo)。(-by Iven)

好了,继续这一系列的教程。现在我们的塔防游戏中已经有敌人绵绵不断的出现。但现在还有一个小问题,我们还不能完全控制每个波次中每种类型的敌人数量。加入我们想要某个波次只出现红色敌人(或者绿色敌人),该怎么办呢。

因此,本部分教程就是解决这个问题的。





在开始之前,不妨先下载上一部分完成后的项目源代码:

http://www.iphonegametutorials.com/usr/uploads/2012/01/TowerDefensePart5a.zip

首先要做的事情就是更改wave类。在Xcode中打开wave.m,然后更改initWithCreeping方法的代码如下:

- (id) initWithCreep:(Creep *)creep SpawnRate:(float)spawnrate RedCreeps:(int)redcreeps GreenCreeps: (int)greencreeps
{
     NSAssert(creep!=nil, @"Invalid creep for wave.");
     if( (self = [self init]) )
     {
          _creepType = creep;
          _spawnRate = spawnrate;
          _redCreeps = redcreeps;
          _greenCreeps = greencreeps;
     }
     return self;
}

对比之前的代码会发现该方法中去掉了之前的totalCreeps参数,而替代以RedCreeps和GreenCreeps。

接下来添加以下代码(同时删除和totalCreeps相关的类似代码):

@synthesize redCreeps = _redCreeps;
@synthesize greenCreeps = _greenCreeps;

然后使用以下代码替代wave.h,如下:

#import "cocos2d.h"
#import "Creep.h"

@interface Wave : CCNode {
    float _spawnRate;
    int _redCreeps;
    int _greenCreeps;
    Creep * _creepType;
}

@property (nonatomic) float spawnRate;
@property (nonatomic) int redCreeps;
@property (nonatomic) int greenCreeps;
@property (nonatomic, retain) Creep *creepType;
- (id)initWithCreep:(Creep *)creep SpawnRate:(float)spawnrate RedCreeps:
(int)redcreeps GreenCreeps:(int)greencreeps;
@end

稍微解释一下:以上所做的一切都是和initWithCreep方法(在addWaves中调用)有关。修改之后,我们就可以分别设置红色敌人和绿色敌人的数量,而不是敌人的总体数量。

返回TutorialScene.m,找到addWaves方法,此时就可以使用修改后的方法来添加波次中的敌人了:

wave = [[Wave alloc] initWithCreep:[FastRedCreep creep] SpawnRate: 0.7 RedCreeps:5 GreenCreeps:15];

当然,如果你是在第6部分项目的基础上一步步修改的,会发现有错误提示。这是因为我们已经删除了totalCreeps这个实例变量,而程序中还有一些地方用到了它。

在addTarget方法中找到以下代码:

if (wave.totalCreeps < 0) {
     return;
}

将其替代成以下代码:

if (wave.redCreeps

紧接着删掉这行代码:

wave.totalCreeps--;

这行代码的作用是减少当前波次剩下敌人的数量,但这里我们将以另一种方式来实现,因此将其删除。

紧接着这行代码会看到下面这段代码:

Creep *target = nil;
if ((arc4random() % 2) == 0) {
     target = [FastRedCreep creep];
} else {
     target = [StrongGreenCreep creep];
}

在上面的代码中,我们会随时设置出现敌人的类型。将以上代码替代如下:

Creep *target = nil;
if ((arc4random() % 2) == 0) {
      if (wave.redCreeps > 0) {
            target = [FastRedCreep creep];
            wave.redCreeps--;
      }
      else if (wave.greenCreeps >0){
            target = [StrongGreenCreep creep];
            wave.greenCreeps--;
            // NSLog(@"no more red");
      }
}
else {
      if (wave.greenCreeps >0) {
            target = [StrongGreenCreep creep];
            wave.greenCreeps--;
      }
      else if (wave.redCreeps >0){
            target = [FastRedCreep creep];
            wave.redCreeps--;
            //NSLog(@"no more green");
      }

}

在新的代码中,我们仍然会随机选择敌人的类型,但会随后检查是否当前波次还有该类型的敌人要出现。这么说可能不太好理解,我还是来举个例子吧。

如果随机生成器选择了红色敌人,那么当前波次中至少有一个红色敌人要出现,然后它会出现在屏幕中,而程序将会减少红色敌人的剩下数量。如果已经没有红色敌人要出现了,那么就让绿色敌人出现,并减少当前波次绿色敌人的剩下数量。这样绕来绕去也不知道说清楚没有,反正上面的代码就是这个意思。

好了,最后还有一点要做的。

找到update方法,之前我们在波次的最后做了一个判断,如下所示:

Wave *wave = [self getCurrentWave];
    //int alivecount = [m._targets count];
    if ([m._targets count] ==0 && wave.totalCreeps

因此这里需要使用以下代码替代上面的代码:

Wave *wave = [self getCurrentWave];
//int alivecount = [m._targets count];
if ([m._targets count] ==0 && wave.redCreeps

这个应该没什么问题,只是把wave.totalCreeps替换成了wave.redCreeps和wave.greenCreeps而已。 

后续的教程将陆续补上。

到这一步的源代码:

http://www.iphonegametutorials.com/usr/uploads/2012/01/TowerDefensePart5b.zip

 

原文在此:

http://www.iphonegametutorials.com/2012/01/12/cocos2d-game-tutorial-–-how-to-build-a-tower-defense-game-for-the-iphone-part-5b-more-wave-control/

标签: cocos2d教程, 塔防游戏教程

?>