CocosCreator源码分析-main.js

定义的全局方法 boot

window.boot = function () {

var settings = window._CCSettings;

window._CCSettings = undefined;

var onProgress = null;

//通过解构 声明四个变量,分别为bundle 的名字,都是内置bundle

let { RESOURCES, INTERNAL, MAIN, START_SCENE } = cc.AssetManager.BuiltinBundleName;

//声明一个方法,控制加载进度条,

function setLoadingDisplay () {

// Loading splash scene

var splash = document.getElementById('splash');

var progressBar = splash.querySelector('.progress-bar span');

onProgress = function (finish, total) {

var percent = 100 * finish / total;

if (progressBar) {

progressBar.style.width = percent.toFixed(2) + '%';

}

};

splash.style.display = 'block';

progressBar.style.width = '0%';

cc.director.once(cc.Director.EVENT_AFTER_SCENE_LAUNCH, function () {

splash.style.display = 'none';//加载完毕后隐藏

});

}

定义onStart

//在run起游戏后 调用onstart

var onStart = function () {

//对于 Apple 这种支持 Retina 显示的设备上默认进行优化,而其他类型设备默认不进行优化,

cc.view.enableRetina(true);

//设置当发现浏览器的尺寸改变时,是否自动调整 canvas 尺寸大小。

cc.view.resizeWithBrowserSize(true);

if (cc.sys.isBrowser) {

setLoadingDisplay();//浏览器的时候处理进度条

}

if (cc.sys.isMobile) {

if (settings.orientation === 'landscape') {//横屏

cc.view.setOrientation(cc.macro.ORIENTATION_LANDSCAPE);

}

else if (settings.orientation === 'portrait') {//竖屏

cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT);

}

// 下面几个平台移动端游戏会在移动端自动尝试进入全屏模式。

cc.view.enableAutoFullScreen([

cc.sys.BROWSER_TYPE_BAIDU,

cc.sys.BROWSER_TYPE_BAIDU_APP,

cc.sys.BROWSER_TYPE_WECHAT,

cc.sys.BROWSER_TYPE_MOBILE_QQ,

cc.sys.BROWSER_TYPE_MIUI,

].indexOf(cc.sys.browserType) < 0);

}//

// Limit downloading max concurrent task to 2,

// more tasks simultaneously may cause performance draw back on some android system / browsers.

// You can adjust the number based on your own test result, you have to set it before any loading process to take effect.

if (cc.sys.isBrowser && cc.sys.os === cc.sys.OS_ANDROID) {

//下载时的最大并发数

cc.assetManager.downloader.maxConcurrency = 2;

//下载时每帧可以启动的最大请求数

cc.assetManager.downloader.maxRequestsPerFrame = 2;

}

var launchScene = settings.launchScene;

var bundle = cc.assetManager.bundles.find(function (b) {

return b.getSceneInfo(launchScene);

});

//通过场景名称加载分包中的场景。

bundle.loadScene(launchScene, null, onProgress,

function (err, scene) {

if (!err) {

cc.director.runSceneImmediate(scene);

if (cc.sys.isBrowser) {

// show canvas

var canvas = document.getElementById('GameCanvas');

canvas.style.visibility = '';

var div = document.getElementById('GameDiv');

if (div) {

div.style.backgroundImage = '';

}

console.log('Success to load scene: ' + launchScene);

}

}

}

);

};

//游戏运行的各项参数

var option = {

id: 'GameCanvas',

debugMode: settings.debug ? cc.debug.DebugMode.INFO : cc.debug.DebugMode.ERROR,//几种模式 具体下面详细说明

showFPS: settings.debug,//

frameRate: 60,

groupList: settings.groupList, 分组

collisionMatrix: settings.collisionMatrix, 分组可进行碰撞的配置

};

1. debugMode(debug 模式,但是在浏览器中这个选项会被忽略)                                <br/>

    *      "debugMode" 各种设置选项的意义。                                                  <br/>

    *          0 - 没有消息被打印出来。                                                      <br/>

    *          1 - cc.error,cc.assert,cc.warn,cc.log 将打印在 console 中。                 <br/>

    *          2 - cc.error,cc.assert,cc.warn 将打印在 console 中。                         <br/>

    *          3 - cc.error,cc.assert 将打印在 console 中。                                  <br/>

    *          4 - cc.error,cc.assert,cc.warn,cc.log 将打印在 canvas 中(仅适用于 web 端)。<br/>

    *          5 - cc.error,cc.assert,cc.warn 将打印在 canvas 中(仅适用于 web 端)。        <br/>

    *          6 - cc.error,cc.assert 将打印在 canvas 中(仅适用于 web 端)。                 <br/>

    * 2. showFPS(显示 FPS)                                                            <br/>

    *      当 showFPS 为 true 的时候界面的左下角将显示 fps 的信息,否则被隐藏。 

 * 4. frameRate (帧率)                                                              <br/>

    *      “frameRate” 设置想要的帧率你的游戏,但真正的FPS取决于你的游戏实现和运行环境。     <br/>

根据配置初始化 assetManager

cc.assetManager.init({

bundleVers: settings.bundleVers,

remoteBundles: settings.remoteBundles,

server: settings.server

});

//声明容器,存放内置bundle

let bundleRoot = [INTERNAL, MAIN];

settings.hasStartSceneBundle && bundleRoot.push(START_SCENE);

settings.hasResourcesBundle && bundleRoot.push(RESOURCES);

var count = 0;

function cb (err) {

if (err) return console.error(err.message, err.stack);

count++;

//第三步,内置bundle 加载完毕,

运行游戏,并且指定引擎配置和 onStart 的回调。

if (count === bundleRoot.length + 1) {

cc.game.run(option, onStart);

}

}

//第一步加载导入为插件的script

cc.assetManager.loadScript(settings.jsList.map(function (x) { return 'src/' + x;}), cb);

第二步,加载内置的bundle

for (let i = 0; i < bundleRoot.length; i++) {

cc.assetManager.loadBundle(bundleRoot[i], cb);

}

};

if (window.jsb) {

var isRuntime = (typeof loadRuntime === 'function');

if (isRuntime) {

require('src/settings.js');

require('src/cocos2d-runtime.js');

if (CC_PHYSICS_BUILTIN || CC_PHYSICS_CANNON) {

require('src/physics.js');

}

require('jsb-adapter/engine/index.js');

}

else {

require('src/settings.js');

require('src/cocos2d-jsb.js');

if (CC_PHYSICS_BUILTIN || CC_PHYSICS_CANNON) {

require('src/physics.js');

}

require('jsb-adapter/jsb-engine.js');

}

/*

* 是否在将贴图上传至 GPU 之后删除原始图片缓存,删除之后图片将无法进行 [动态合图](https://docs.cocos.com/creator/manual/zh/advanced-topics/dynamic-atlas.html)。

    * 在 Web 平台,你通常不需要开启这个选项,因为在 Web 平台 Image 对象所占用的内存很小。

    * 但是在微信小游戏平台的当前版本,Image 对象会缓存解码后的图片数据,它所占用的内存空间很大。

    * 所以我们在微信平台默认开启了这个选项,这样我们就可以在上传 GL 贴图之后立即释放 Image 对象的内存,避免过高的内存占用。

*/

cc.macro.CLEANUP_IMAGE_CACHE = true;

window.boot();

}

欢迎交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容