一、创建文件= =
EnemyLayer.h
EnemyLayer.cpp
Ps:我绝对不是在凑字数~。
二、How to do?
(1)一些宏的设定~
enum enemyType //设置好飞机的类型~ { ENEMY_MIN = 1, ENEMY_MED, ENEMY_MAX }; const int ENEMY_MIN_LIFE = 1; //设置飞机的生命值~ const int ENEMY_MED_LIFE = 7; const int ENEMY_MAX_LIFE = 20; const int ENEMY_MIN_COUNT = 30; //设置飞机的同时在屏幕的最大数量~ const int ENEMY_MED_COUNT = 10; const int ENEMY_MAX_COUNT = 5;
(2)发射敌机~
由于那个啥啥啥啥啥,有三种敌机,但是方法就是重复三遍,然后把一些函数合并下,大家可以参考gitHub上的代码,然后我就默默的只将一个实现喽~
先看看有哪些准备的功能~
Vector<Enemy*> _enemyArray1; //存飞机的~ float _minDuration, _maxDuration; //敌机飞过去的时间 CC_SYNTHESIZE(float, _enemy1SpawRate, _enemy1SpawRate); //定义下敌机飞过去的速度~ float _timeSum1; //到时就知道啦~ void initEnemy1(); //初始化enemy1 void spawEnemy1(float dt); //发射enemy1 void spawEnemy(float dt); //这是总的函数,下面就是控制发射3钟不同的飞机 Enemy* getAvailableEnemy(int tag); //从数组中拿出空闲的飞机·
首先就是初始化吧,额,不不,先弄在构造函数初始化一些列的东东~
_minDuration = 2; _maxDuration = 4; _enemy1SpawRate = 2.5; _enemy2SpawRate = 5; _enemy3SpawRate = 100; _timeSum1 = 0; _timeSum2 = 0; _timeSum3 = 0;
注意有些是实现其他类型飞机所需要的哦~
a、初始化飞机
void EnemyLayer::initEnemy1() { for (int i = 0; i < ENEMY_MIN_COUNT; i++) { auto enemy1 = Enemy::create();//创建一个Enemy enemy1->bindSprite(Sprite::createWithSpriteFrameName("enemy1.png"), ENEMY_MIN_LIFE); this->addChild(enemy1); enemy1->setVisible(false);//主要是初始化,还没有要发射,所以不能看到的说~ enemy1->getSprite()->setTag(ENEMY_MIN);//主要是为了方便后面的函数执行 _enemyArray1.pushBack(enemy1);//放进数组中 } }
b、发射灰机~
Enemy* EnemyLayer::getAvailableEnemy(int tag) { if (tag == ENEMY_MIN) //就是遍历整个数组,找到一个空闲的(即不可见的)就取出来、· { for (auto&sp : _enemyArray1) { if (!sp->isVisible()) { return sp; } } return nullptr; } else if (tag == ENEMY_MED) //后面是一样的~ { for (auto&sp : _enemyArray2) { if (!sp->isVisible()) { return sp; } } return nullptr; } else { for (auto&sp : _enemyArray3) { if (!sp->isVisible()) { return sp; } } return nullptr; } }
void EnemyLayer::spawEnemy1(float dt)//发射灰机~~~~~~~~~~ { auto enemy1 = getAvailableEnemy(ENEMY_MIN);//取得一个空闲的灰机~ if (enemy1) { enemy1->setLife(ENEMY_MIN_LIFE); //由于以后可能没打死,但是血扣了,所以每次都要补满血~
//下面这段是计算飞机从哪里出现的~大家可以理解理解~
Size enemy1Size = enemy1->getSprite()->getContentSize(); Size visibleSize = Director::getInstance()->getVisibleSize(); int minX = enemy1Size.width / 2; int maxX = visibleSize.width - enemy1Size.width / 2; int rangeX = maxX - minX; int actualX = (rand() % rangeX) + minX; enemy1->setPosition(ccp(actualX, visibleSize.height + enemy1Size.height / 2)); enemy1->setVisible(true);
//这个其实主要是一个随机的速度,毕竟飞机不能总是一样快吧~~~~ int rangeDuration = _maxDuration - _minDuration; float actualDuration = CCRANDOM_0_1()*rangeDuration + _minDuration; auto actionMove = MoveBy::create(actualDuration, Vec2(0, enemy1->getSprite()->getPositionY() - visibleSize.height - enemy1Size.height)); auto actionDone = Hide::create(); auto action = Sequence::createWithTwoActions(actionMove, actionDone); //这里的意思就是执行这个动作:从上往下飞过去,如果飞出屏幕就隐藏~。
enemy1->runAction(action); } }
void EnemyLayer::spawEnemy(float dt) {
//没错_enemy1SpawRate就是用来控制游戏难度的~当然上面的发射速度也是可以的~,但是我偷懒就用下面这个来了
//就是计时,每到_enemy1SpawRate后发射出去· _timeSum1 += dt; if (_timeSum1 >= _enemy1SpawRate) { _timeSum1 = 0; this->spawEnemy1(dt); } }
上面三个函数完成之后,那就可以在Init()中加入下面的代码~
this->initEnemy1(); this->schedule(schedule_selector(EnemyLayer::spawEnemy), 1.0/60);
c、加到GameScene之后,就可以默默欣赏效果图~
然后,EnemyLayer的简单搭建就到这里啦~.