本篇来介绍下游戏中的敌人类,既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"));
下一篇来介绍主角类Plane。