http://blog.csdn.net/hust_superman/article/details/38021955
本篇来介绍下游戏中的敌人类,既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。