Cocos2D:塔防游戏制作之旅(十四)

塔之战:炮塔的攻击

炮塔就位了?检查.敌人前进中?再次检查 - 它们看起来就是如此!看起来到了击溃这些家伙的时候了!这里我们将智能置入炮塔的代码中去.

每一个炮塔检查是否有敌人在其攻击范围.(炮塔一次只能攻击一个敌人.猫猪注)如果有,炮塔将开始向敌人开火直到两件事之一发生:敌人移出攻击范围或者敌人被摧毁.炮塔接着开始寻找其他欠扁的家伙 :]

将它们放到一起,新建新炮塔!你已经有一个防御基础了!

因为敌人和炮塔类相互依赖彼此,你不得不首先更新它们类的头文件,去避免你在修改实现代码时Xcode发生显示错误.

首先,打开Tower.h文件,然后完成以下修改:

// Add some instance variables
BOOL attacking;
Enemy *chosenEnemy;

// Add method definition
-(void)targetKilled;

打开Enemy.h文件修改如下:

// Add instance variable
NSMutableArray *attackedBy;

// Add method definitions
-(void)getAttacked:(Tower *)attacker;
-(void)gotLostSight:(Tower *)attacker;
-(void)getDamaged:(int)damage;

下一步,回到Tower.m中做如下修改:

// Import Enemy header at the top of the file:
#import "Enemy.h"

// Add the following methods
-(void)attackEnemy
{
    [self schedule:@selector(shootWeapon) interval:fireRate];
}

-(void)chosenEnemyForAttack:(Enemy *)enemy
{
    chosenEnemy = nil;
    chosenEnemy = enemy;
    [self attackEnemy];
    [enemy getAttacked:self];
}

-(void)shootWeapon
{
    CCSprite * bullet = [CCSprite spriteWithFile:@"bullet.png"];
    [theGame addChild:bullet];
    [bullet setPosition:mySprite.position];
    [bullet runAction:[CCSequence actions:
                       [CCMoveTo actionWithDuration:0.1 position:chosenEnemy.mySprite.position],
                       [CCCallFunc actionWithTarget:self selector:@selector(damageEnemy)],
                       [CCCallFuncN actionWithTarget:self selector:@selector(removeBullet:)], nil]];

}

-(void)removeBullet:(CCSprite *)bullet
{
    [bullet.parent removeChild:bullet cleanup:YES];
}

-(void)damageEnemy
{
    [chosenEnemy getDamaged:damage];
}

-(void)targetKilled
{
    if(chosenEnemy)
        chosenEnemy =nil;

    [self unschedule:@selector(shootWeapon)];
}

-(void)lostSightOfEnemy
{
    [chosenEnemy gotLostSight:self];
    if(chosenEnemy)
        chosenEnemy =nil; 

    [self unschedule:@selector(shootWeapon)];
}

最后,替换之前版本只能怪留下的空白update方法:

-(void)update:(ccTime)dt {
    if (chosenEnemy){

        //We make it turn to target the enemy chosen
        CGPoint normalized = ccpNormalize(ccp(chosenEnemy.mySprite.position.x-mySprite.position.x,
                                              chosenEnemy.mySprite.position.y-mySprite.position.y));
        mySprite.rotation = CC_RADIANS_TO_DEGREES(atan2(normalized.y,-normalized.x))+90;

        if(![theGame circle:mySprite.position withRadius:attackRange
             collisionWithCircle:chosenEnemy.mySprite.position collisionCircleRadius:1])
        {
            [self lostSightOfEnemy];
        }
    } else {
        for(Enemy * enemy in theGame.enemies)
        {
            if([theGame circle:mySprite.position withRadius:attackRange
                collisionWithCircle:enemy.mySprite.position collisionCircleRadius:1])
            {
                [self chosenEnemyForAttack:enemy];
                break;
            }
        }
    }
}
时间: 2024-10-14 08:11:14

Cocos2D:塔防游戏制作之旅(十四)的相关文章

Cocos2D:塔防游戏制作之旅(十八)

在Enemy.m的getDamaged:方法只给你添加如下1行(在if条件内): [theGame awardGold:200]; 现在运行游戏你将注意到你不能放置超出你资源金币的炮塔了.当然杀死敌人可以奖励金币,so你可以继续购买更多的炮塔!这是一个令人惊叹的系统,不是吗? 现在,最终,对于一些额外的地方,添加一些酷酷的背景音乐(由Kevin MacLeod制作)和cxfr制作的音效,他们可以使你的游戏更有趣一些! 打开HelloWorldLayer.m并且添加以下修改: //At the t

Cocos2D:塔防游戏制作之旅(十六)

编译运行你的app,放置一些炮塔在你的地图上吧!你将看到炮塔在敌人移动如攻击范围时如何立即开始攻击,并且敌人的血条将随着攻击不断减少知道它们被人道毁灭!胜利即将来临了! 哦!Okay,这里只有少数细节还未实现你就可以得到一个完整特性的塔防游戏啦!音效应该是一个不错的尝试.并且尽管不可战胜和极端富裕很好,你的基地还是应该有能力持续抗打的能力 - 并且你需要限制玩家的金币供给. 闪耀着的炮塔:Gotta Polish It All! 开始实现显示玩家剩余的命数 - 以及当玩家失败时发生什么! 打开H

Cocos2D:塔防游戏制作之旅(十)

最终,draw方法显示这些路径点被放置在哪里,并且绘制出路径点之间的连线,它们仅仅被用作调试.一个成品游戏不应该绘制敌人的路径 - 那对于玩家来说太过容易了! 创建路径点的列表.打开HelloWorldLayer.h并且添加以下属性: @property (nonatomic,strong) NSMutableArray *waypoints; 下一步,添加以下代码到HelloWorldLayer.m文件中: //At the top of the file: #import "Waypoint

Cocos2D:塔防游戏制作之旅(十五)

Yes,貌似添加了好多的代码啊 ;] ,在你添加更多代码时,你可能注意到一些Xcode中的一些警告.首先你先忽略这些警告,我们先添加少量最终缺失的部分,然后再来解释上面代码做了什么! 在Enemy.m中修改如下: // Add the following at the beginning of initWithTheGame: (within the "if" condition) attackedBy = [[NSMutableArray alloc] initWithCapacit

Cocos2D:塔防游戏制作之旅(一)

原文地址:http://www.raywenderlich.com/37701/how-to-make-a-tower-defense-game-tutorial 由Pablo Ruiz写的入门教程,内容相当不错,现由本猫翻译出来,希望大家可以从中学到不少东西.由于本猫水平有限,难免不少错误,欢迎拍砖指正 ;) 文章写成于2013/6/8,Cocos2D版本为2.1-rc1,首次由Pablo Ruiz发布,由Brian Broom更新. 塔防游戏类型有理由成为iOS上最受欢迎的游戏类型.建造终极

Cocos2D:塔防游戏制作之旅(二)

一个象牙塔的视图 如果你并不熟悉此类型的游戏,塔防游戏是一个战略游戏,你需要购买和将武装塔放置在战略位置,去阻止一波又一波的敌人到达并摧毁你的基地 每一波敌人都更强,这些更强的对手有着更快的速度和对于你攻击而言更厚的防御力.在游戏最终你将在所有攻击中存活下来(胜利!),或者足够的敌人到达你的基地将其摧毁(啊偶!你被打败了!). 这里有一个游戏运行时的截图: 就像你看到的那样,敌人从屏幕左上角出现,然后沿着绿色的路径直达玩家的基地.顺着这条路径,周围有一些可以放置炮塔的平台.玩家可以购买和放置他们

Cocos2D:塔防游戏制作之旅(三)

整合炮塔资源 为了快速开始,我们为你创建了开始的项目.它包括了一个空白的Cocos2D项目以及大多数你将在教程中使用到的资源. 所以首先下载该 开始项目 并且解压缩到你指定的位置中去. 注意:该项目的艺术资源来有Vicki制作的自免费艺术包中,它基于Oray Studios的其他免费的艺术包.如果你喜欢它们,你可以雇佣Oray Studios中的艺术家们! 开始项目基于Cocos2D 2.1(RC1)的基础模板而创建,他提供你一个可工作的项目:包含一个在屏幕上带有居中标签的HelloWorldL

Cocos2D:塔防游戏制作之旅(十七)

getHpDamage方法当敌人到达基地时被调用.你需要添加该方法到Enemy.m的update:方法中去,以便检查当敌人到达基地是会发生什么.幸运的是,你已经在之前的代码中实现这些了,你可以接着往下走了! ;] 编译运行游戏,但是这次控制住你即将扣动扳机的手指让敌人抵达你的基地吧. 你将看到玩家生命在减少,直到游戏结束. 欧拉,肥猫(你怎么知道我是肥猫? 猫猪注),是时候限制金币供给了. 大多数游戏被实现为"零和(zero-sum)"型的特性,赋予每个塔一定消费并且限制玩家的资源.你

Cocos2D:塔防游戏制作之旅(八)

如果所有东西通过检查,则创建一个新炮塔,将它放置在基座上,然后添加到towers数组中. 注意:在方法最后的bridge语法需要做一些解释.你下载的初始项目已经为一 些文件打开ARC,但不是Cocos2D的所有文件.当你存储一个CCSprite属性 (non-ARC)到你自己的炮塔对象的指针(ARC)中去时,__bridge指导告知编 译器仅仅简单存储指针,但是不传递所有权.更详细的内容可以在 http://www.mikeash.com/pyblog/friday-qa-2011-09-30-