zoukankan      html  css  js  c++  java
  • 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());
    }
  • 相关阅读:
    77777 77777(2) WriteUp 绕waf技巧学习
    简单sql注入学到的延时盲注新式攻击
    代码审计 => 74cms_v3.5.1.20141128 一系列漏洞
    mysql注入新姿势(数字与字符编码注入) hex,conv
    Netty 3升级Netty4实践
    微信小程序获取用户openid,头像昵称信息,后台java代码
    转:JSP 分页显示数据 (Oracle)
    从数据库提取数据通过jstl显示在jsp页面上
    转:微信生成二维码java
    转:微信开发获取地理位置实例(java,非常详细,附工程源码)
  • 原文地址:https://www.cnblogs.com/ttss/p/4145189.html
Copyright © 2011-2022 走看看