本篇來介紹下游戲中的敵人類,既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。