单例模式

单例:即只有一个类对象,且提供全局的访问权限,为了不频繁的创建对象

关卡数,最高分都能保存下来。

特点:

1.构造函数私有

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

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

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

复制代码
#ifndef _MANAGER_H_
#define _MANAGER_H_
#include "cocos2d.h";
//包含敌机和子弹的头文件
#include "Bullet\Bullet.h";
#include "Enemy\EnemyBase.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());
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值