如何设计开发iPhone塔防游戏5- 炮火凶猛

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

今天我们会学习该系列教程的最新章节—“让炮塔开火!”对于一款塔防游戏来说,这无疑是最重要的一部分内容。当然现在哥暂时还不会在这一部分就创建出各种有趣的炮塔,不过你后续有足够的机会来进一步完善。

进入正题之前,还是先把源代码下载一下吧:Tower Defense Part 4.

首先我们要做的就是创建真实的炮塔,也就是Projectile这个类。Projectile类的内容当前似乎没什么内容,但现在是空白不意味着以后还是。

 

让我们看看Projectile.h和Projectile.m这两个文件:

Projectile.h:

#import "cocos2d.h"

@interface Projectile : CCSprite {

}

+ (id)projectile;

@end

Projectile.m:

#import "Projectile.h"

@implementation Projectile

+ (id)projectile {

    Projectile *projectile = nil;
    if ((projectile = [[[super alloc] initWithFile:@"Projectile.png"] autorelease])) {

    }

    return projectile;

}

- (void) dealloc
{ 
    [super dealloc];
}

@end

现在我们需要在TutorialScene.m的update方法中添加新的实现代码。这部分逻辑机制将会来处理炮弹和敌人的碰撞检测问题。

基本的机制很简单:

1.遍历所有的导弹

2.对于每个导弹,遍历当前所有的目标

3.判断导弹的边框是否和目标的边框相交

4.如果二者相交,就说明敌人被击中,那么少不了血条就要下降了,同时还要把导弹加到销毁数组中

5.如果敌人的生命值下降为0,就要把这个目标添加到销毁数组中。

6.删除导弹和敌人销毁数组中的所有对象。

 

实现以上目的的代码如下:

- (void)update:(ccTime)dt {

    DataModel *m = [DataModel getModel];
    NSMutableArray*projectilesToDelete = [[NSMutableArray alloc] init];

    for (Projectile *projectile in m._projectiles) {

        CGRectprojectileRect = CGRectMake(projectile.position.x - (projectile.contentSize.width/2),
                                           projectile.position.y - (projectile.contentSize.height/2),
                                           projectile.contentSize.width,
                                           projectile.contentSize.height);

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

        for (CCSprite *target in m._targets) {
            CGRect targetRect = CGRectMake(target.position.x - (target.contentSize.width/2),
                                           target.position.y - (target.contentSize.height/2),
                                           target.contentSize.width,
                                           target.contentSize.height);

            if (CGRectIntersectsRect(projectileRect, targetRect)) {      
                [projectilesToDelete addObject:projectile];           
                Creep *creep = (Creep *)target;
                creep.hp--;
         if (creep.hp

接下来我们要看看如何处理开火机制。打开Tower.m文件,在towerLogic这个方法的实现代码中,我们在RotateTo动作的后面添加了一个附加的动作。我们添加了一个”CCCallFunc”动作,将调用finishFiring这个方法。

[self runAction:[CCSequence actions:
                         [CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],
                         [CCCallFunc actionWithTarget:self selector:@selector(finishFiring)],
                         nil]];

仅当我们的炮塔指向正确的方向时,才会调用finishFiring方法。其目的在于创建一个新的导弹,并将其添加到DataModel的导弹数组(为后面做参考),然后指定一个位置和最终目标。

- (void)finishFiring {
    DataModel *m = [DataModel getModel];
    self.nextProjectile = [Projectile projectile];
    self.nextProjectile.position = self.position;
    [self.parent addChild:self.nextProjectile z:1];
    [m._projectiles addObject:self.nextProjectile];
       ccTime delta = 1.0;
    CGPoint shootVector = ccpSub(self.target.position, self.position);
    CGPointnormalizedShootVector = ccpNormalize(shootVector);
    CGPoint overshotVector = ccpMult(normalizedShootVector, 320);
    CGPointoffscreenPoint = ccpAdd(self.position, overshotVector);
       [self.nextProjectile runAction:[CCSequence actions:
                                [CCMoveTo actionWithDuration:delta position:offscreenPoint],
                                [CCCallFuncN actionWithTarget:self selector:@selector(creepMoveFinished:)],
                                nil]];
       self.nextProjectile.tag = 2;       
 self.nextProjectile = nil;
}

从以上的代码上你可以看到,我们让导弹运行了另一个CCMoveTo动作,从而将导弹移动一个特定的距离-这个距离会由发射炮弹的炮塔来决定,不过我们设置了一个默认的距离是320。一旦炮弹抵达目的地,就会调用Tower.m文件中的creepMoveFinished方法,从DataModel的导弹数组中删除这枚炮弹,并从屏幕上将其清除。

-(void)creepMoveFinished:(id)sender {
    DataModel * m = [DataModel getModel];
     CCSprite *sprite = (CCSprite *)sender;
    [self.parent removeChild:sprite cleanup:YES];
     [m._projectiles removeObject:sprite];   
}

好了,如果你现在用command +b来编译,然后用command +r来测试,就可以在地图上放置炮塔,并且向滔滔不绝而来的敌人开火了。

感觉怎么样?是不是很酷?

不过这也仅仅是个雏形而已,我们在后续还需要添加更多的炮塔,添加购买和出售机制,添加得分机制,同时增加更多更多。

革命尚未成功,同志仍需努力!

很遗憾的是,从4月21日开始,这个系列的教程没有再更新过。通过作者本人的评论回复我们得知,现在作者正忙于工作,但后续还是会完善这个教程的,请大家耐心等待吧(不得不耐心,我也等待了快4个月了。。。) 

如果觉得翻译的问题太大,可以直接看原文,

http://www.iphonegametutorials.com/tutorials/

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

?>