• cocos中常用到的单例模式


    单例:即只有一个类对象,且提供全局的访问权限

    特点:

    1.构造函数私有

    2.私有的静态成员指针,标识是否已产生了单例实例

    3.提供一个getInstance()方法来获取单例对象

    下面已打飞机中的子弹管理类来说明,单例的用法及实现:

    #ifndef _MANAGER_H_
    #define _MANAGER_H_
    #include "cocos2d.h";
    //包含敌机和子弹的头文件
    #include "BulletBullet.h";
    #include "EnemyEnemyBase.h";
    
    USING_NS_CC;
    
    //子弹和敌机管理器,做成单例
    class Manager
    {
    public:
        static Manager * getInstance();
        static void Manager::freeInstance(void);
    private:
        static Manager * m_manager;
        Manager();
        bool init();
    public:
        //使用以下的方法定义了俩个容器,并且实现了get方法,一定要注意get的返回值,这个返回的是引用
        //官方建议容器最好不要在堆上分配内存空间,当我们在栈上分配内存空间的时候一定要传递引用,否则就出错了
        Vector<EnemyBase *> & getEnemyVector(){return m_enemyVector;};
        Vector<Bullet *> & getBulletVector(){return m_bulletVector;};
    private:
        Vector<EnemyBase *> m_enemyVector;
        Vector<Bullet *> m_bulletVector;
    };
    
    #endif

    子弹管理类的.cpp文件

    #include "Manager.h"
    
    Manager * Manager::m_manager = NULL;
    
    //在构造函数的初始化列表中初始化数组
    Manager::Manager() : m_enemyVector(),m_bulletVector()
    {
    }
    
    Manager * Manager::getInstance()
    {
        if(m_manager == NULL)
        {
            m_manager = new Manager();
        }
    
        return m_manager;
    }
    
    void Manager::freeInstance(void)
    {
        if(m_manager != NULL)
        {
            delete m_manager;
            m_manager = NULL;
        }
    }

    3.在主场景中如何使用单例来管理子弹:

    //场景切换完毕调用
    void MainGame::onEnterTransitionDidFinish()
    {
        //必须先调用父类的函数
        Layer::onEnterTransitionDidFinish();
        //添加敌机,每秒添加一个
        this->schedule(SEL_SCHEDULE(MainGame::addEnemy),1.0f);
        //添加子弹,每0.08秒产生一颗子弹
        this->schedule(SEL_SCHEDULE(MainGame::addBullet),0.08f);
        //碰撞检测
        this->schedule(SEL_SCHEDULE(MainGame::isHitEnemy),0.016f);
    }
    
    //碰撞检测
    void MainGame::isHitEnemy(float tm)
    {
    
    }
    
    //添加子弹
    void MainGame::addBullet(float tm)
    {
        auto bullet = Bullet::create();
        bullet->initBullet("bullet1.png");
        auto point = Point(m_player->getPositionX(),
            m_player->getPositionY()+m_player->getContentSize().height/2+10);
        bullet->setPosition(point);
    
        this->addChild(bullet);
        //将子弹添加到管理器中
        auto & vector = Manager::getInstance()->getBulletVector();
        vector.pushBack(bullet);
        log("%d",vector.size());
    }
  • 相关阅读:
    frida
    ES中filter 和map的使用
    阿里巴巴15 款开发者工具
    小程序的开发记录
    微信3.1小程序商城源码C# ASP.NET 多用户微商城 saas模式
    js中for,for in,forEach,for of的使用
    Vuejs学习笔记
    vue.js/element-ui/webpack 开发记录
    ESXi开启虚拟化
    shell把字符串中的字母去掉,只保留数字
  • 原文地址:https://www.cnblogs.com/ttss/p/4145189.html
Copyright © 2020-2023  润新知