前言
单例,在游戏开发中是比较常用的功能,全局唯一,可以在任何地方直接获取,
省去了方法赋值 或者 属性面板拖动的麻烦。
普通单例_饿汉模式
不管有没调用,一开始就创建单例
// Singleton.js
var Singleton = cc.Class({
// 成员变量
name : "",
age : 0,
ctor () {
this.name = "Leovany";
this.age = 20;
},
statics: {
_instance: null
},
printInfo(){
cc.warn("name = " + this.name+",age = " + this.age);
}
});
Singleton._instance = new Singleton();
module.exports = Singleton;
// GameManager.js
// 引入单例类
var Singleton = require("Singleton");
var GameManager = cc.Class({
cc.warn(Singleton._instance.name);
Singleton._instance.printInfo();
});
普通单例_饱汉模式
调用时才创建单例对象
// Singleton.js
var Singleton = cc.Class({
// 成员变量
name : "",
age : 0,
ctor () {
this.name = "Leovany";
this.age = 20;
},
printInfo(){
cc.warn("name = " + this.name+",age = " + this.age);
}
});
Singleton._instance = null;
Singleton.getInstance = function () {
if(!Singleton._instance){
Singleton._instance = new Singleton();
}
return Singleton._instance;
}
module.exports = Singleton;
// GameManager.js
// 引入单例类
var Singleton = require("Singleton");
var GameManager = cc.Class({
// 调用
cc.warn(Singleton.getInstance().name);
Singleton.getInstance().printInfo();
});
单例组件
1.新建一个 GameManager.js
// 开头必须 新建一个变量引用 var GameManager
var GameManager = cc.Class({
extends: cc.Component,
properties: {
age : 20
},
statics: {
_instance : null
},
//最先进入地方
onLoad(){
cc.warn(" ============== GameManager init" );
GameManager._instance = this;
//设置帧率
cc.game.setFrameRate(60);
//设置该对象为不销毁
cc.game.addPersistRootNode(this.node);
},
2.调用地方
新建一个 Test.js
// 开头必须require 引入单例 GameManager
var GameManager = require("GameManager");
cc.Class({
extends: cc.Component,
start () {
// 直接调用
// 输出: GameManager name : GameManager<GameManager>,age = 20
cc.warn("GameManager name : "+ GameManager._instance.name
+",age = " + GameManager._instance.age );
},
});
特别强调
- 单例组件类,开头必须要有变量引用 ,如
var GameManager = cc.Class({...})
- 调用单例组件的类,开头必须
require
引入