本篇来介绍下游戏中的敌人类,既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。
时间: 2024-10-13 16:28:00