豪华版飞机大战系列(三)

本篇来介绍下游戏中的敌人类,既EnemySprite.h和EnemySprite.cpp中关于敌人类中的具体实现。

游戏中的敌人类主要有四种,三种不同的敌机和炸弹从上面随机的落下来,同时每个敌人都有自己的生命值,当生命值为0后会被从游戏中移除。

看一下敌人信息的头文件:EnemyInfo.h

#pragma once
const int ENEMY1_MAXLIFE=3;
const int ENEMY2_MAXLIFE=5;
const int ENEMY3_MAXLIFE=10;
const int ENEMY1_SCORE=1;
const int ENEMY2_SCORE=6;
const int ENEMY3_SCORE=30;
enum EnemyType
{
 Enemy1 = 1,
 Enemy2,
 Enemy3,
 Enemy4,
};
```


这个文件中主要设置了枚举类型来区别不同的敌人,同时设置了得人的生命数和每个敌人的分数,定义常量可以方便程序的维护。


接下来看下EnemySprite.h头文件:
#include "cocos2d.h"
#include "EnemyInfo.h"
USING_NS_CC;
class EnemySprite : public Node
{
public:
 EnemySprite();//构造函数
 ~EnemySprite();//析构函数
 virtual bool init();//初始化函数
 CREATE_FUNC(EnemySprite);//create函数宏定义,系统已经实现
public:
 void setEnemyByType(EnemyType enType);//设置敌人的种类
 Sprite* getSprite();//取得已经创建的敌人
 int getLife();//获取生命值
 void loseLife();//被子弹击中后生命值减少
 Rect getBoundingBox();//取得敌人的外包装矩形
 Point getcurPoint();//取得敌人的位置
private:
 Sprite *pEnemySprite;
 int nLife;
};
```

上述中的函数都做了详细的注释,接下来看EnemySprite.cpp文件中的各种实现:
include "EnemySprite.h"
EnemySprite::EnemySprite() {}
EnemySprite::~EnemySprite() {}
/**
 * 根据敌机类型来创建不同的敌机
 */
void EnemySprite::setEnemyByType(EnemyType enType) {
 switch (enType) {
 case Enemy1:
 pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n1.png"));
 nLife = ENEMY1_MAXLIFE;
 break;
 case Enemy2:
 pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n2.png"));
 nLife = ENEMY2_MAXLIFE;
 break;
 case Enemy3:
 pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n3.png"));
 nLife = ENEMY2_MAXLIFE;
 break;
 case Enemy4:
 pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n_boss.png"));
 nLife = ENEMY3_MAXLIFE;
 break;
 default:
 return;
 break;
 }
 this->addChild(pEnemySprite);
 pEnemySprite->setScale(0.6f);
 Size winSize = Director::getInstance()->getWinSize();
 Size enemySize = pEnemySprite->getContentSize();
 //设置敌机随机出现的位置
 int minX = enemySize.width / 2;
 int maxX = winSize.width - enemySize.width / 2;
 int rangeX = maxX - minX;
 int actualX = (rand() % rangeX) + minX;
 this->setPosition(Point(actualX, winSize.height + enemySize.height / 2));
}
bool EnemySprite::init() {
 bool pRet = true;
 if (!Node::init()) {
 pRet = false;
 }
 return pRet;
}
/**
 * 取得创建的敌机精灵
 */
Sprite* EnemySprite::getSprite() {
 return pEnemySprite;
}
/**
 * 取得生命值
 */
int EnemySprite::getLife() {
 return nLife;
}
/**
 * 生命值减少,每次被击中家少0.5
 */
void EnemySprite::loseLife() {
 nLife = nLife - 0.5;
}
/**
 * 取得现在的位置
 */
Point EnemySprite::getcurPoint() {
 return this->getPosition();
}
/**
 * 获取外包装矩形
 */
Rect EnemySprite::getBoundingBox() {
 Rect rect = pEnemySprite->boundingBox();
 Point pos = this->convertToWorldSpace(rect.origin);
 Rect enemyRect(pos.x, pos.y, rect.size.width, rect.size.height);
 return enemyRect;
}
```


上述函数的实现都比较简单,并在关键处做了说明,对于精灵图片的获取是用的缓存单例类来获取的,第一次加载图片后缓存到游戏中,可以减少每次都加载图片所带来的性能损失。用缓存类来创建精灵的代码如下:
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n1.png"));
```


好了,这篇主要介绍了敌人类的实现,创建好敌人类后就可以在GameLayer中直接调用此文件中已经实现好的函数来创建精灵,使各个文件的功能独立,模块分明,更好的来维护项目。

下一篇来介绍主角类Plane。

讲的很细致非常赞

like this, thank you