ccc-MVC设计之场景管理
重点
- 需求:解决了场景切换的时候资源预加载的问题
- 设计思想
- api的编写
需求
每一个场景进行切换的时候,我们都希望他可以有自己的加载包,自己的进入函数,根据自己的需求把每一个资源进行操作(删除)
设计思想
- 进入场景需要加载的配置包(资源包)
- 加载完毕以后进入场景
- 退出场景的删除对应的资源
- 结合上一期的资源管理
使用一个场景模版进行编写
//加载资源包
var res_mgr = require("res_mgr");
// 标准资源包的格式;根据需求把资源包加载进来
var res_pkg = {
prefabs: [
"ui_prefabs/LoginUI",
],
sprite_frames:[],
audio_clips: [],
sprite_atlases: [],
};
//核心场景管理的三个函数
var scene = {
//进行资源的加载
preload(on_process, on_finished) {
res_mgr.Instance.preload_res_pkg(res_pkg, on_process, on_finished);
},
//进行进入函数的操作
enter() {
//场景的资源都放入Canvas下面
this.canvas = cc.find("Canvas");
if (this.canvas === null) {
cc.error("[game_app]: canvas is null");
}
var ui = cc.instantiate(res_mgr.Instance.get_res("ui_prefabs/LoginUI"));
this.canvas.addChild(ui);
this.ui = ui;
},
// 删除当前场景的数据,
// bRelease:是否执行资源卸载; // 同一个场景切换的时候,可能不用卸载资源
// bRelease一般为true,只有同一个场景切换到新的自己这个场景,为false;
destroy(bRelease) {
// 删除你的游戏内容
this.ui.removeFromParent();
// end
// 卸载哪些资源包由你自己根据游戏决定;
if (bRelease) { // 你要释放的资源包;
res_mgr.Instance.release_res_pkg(res_pkg);
}
},
};
module.exports = scene;
测试
在game_mgr增加两个函数
//进入场景的函数
enter_scene(scene) {
if (scene === null) {
return;
}
if (this.cur_scene !== null) {
//是否需要进行资源的删除
this.cur_scene.destroy(this.cur_scene !== scene);
}
this.cur_scene = scene;
//进入场景
scene.enter();
},
//游戏资源的加载
preload_scene(scene, on_process, on_finished) {
scene.preload();
},
然后在game_app上进行测试,game_app 继承game_mgr
var game_mgr = require("game_mgr");
var event_mgr = require("event_mgr");
var res_mgr = require("res_mgr");
var login_scene = require("login_scene");//加载对应的场景的模块
var game_app = cc.Class({
extends: game_mgr,
statics: {
Instance: null,
},
properties: {
},
onLoad() {
if (game_app.Instance === null) {
game_app.Instance = this;
}
else {
cc.error("[error]:game_app has multi instances");
this.destroy();
return;
}
game_mgr.prototype.onLoad.call(this);
},
start() {
//调用对应的场景
this.enter_scene(login_scene);
this.scheduleOnce(function(){
this.enter_scene(login_scene);
}.bind(this), 5);
},
});
javascript基础教程