小熊1986

导航

ccc-MVC设计之场景管理

重点

  • 需求:解决了场景切换的时候资源预加载的问题
  • 设计思想
  • api的编写

需求

每一个场景进行切换的时候,我们都希望他可以有自己的加载包,自己的进入函数,根据自己的需求把每一个资源进行操作(删除)

设计思想

  1. 进入场景需要加载的配置包(资源包)
  2. 加载完毕以后进入场景
  3. 退出场景的删除对应的资源
  4. 结合上一期的资源管理

使用一个场景模版进行编写

//加载资源包
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);
	},
});

posted on 2021-05-05 07:58  小熊1986  阅读(70)  评论(0编辑  收藏  举报