豪華版飛機大戰系列(三)

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章