首页 > 代码库 > 豪华版飞机大战系列(三)

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

本篇来介绍下游戏中的敌人类,既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。




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