• cocos2dx游戏开发——微信打飞机学习笔记(八)——EnemyLayer的搭建


    一、创建文件= =

                  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之后,就可以默默欣赏效果图~

    image

     

    然后,EnemyLayer的简单搭建就到这里啦~.

  • 相关阅读:
    MYSQL语法篇之:“建”、“增”
    MYSQL数据库管理系统
    数据库管理系统
    初识数据库
    JDK/JRE/JVM的区别与联系
    计算机语言的发展史
    Java的三大版本
    Java的特性和优势
    初识Java
    补充:DOS命令
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/3934480.html
Copyright © 2020-2023  润新知