cocos中常⽤到的单例模式单例:即只有⼀个类对象,且提供全局的访问权限
特点:
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());
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论