cc.debug源码及使用

本文深入研究了Cocos Creator的cc.debug模块,包括cc.debug的函数列表、初始化、resetDebugSetting的实现,特别是日志等级(DebugMode)与bind(console)的原因。此外,还探讨了cc.debug模块的属性,如FPS信息、游戏内日志输出、cc.logID及其工作原理。文章最后讨论了cc._throw函数的用途。
摘要由CSDN通过智能技术生成

cc.debug研究

CCDebug.js:cocos2d\core\CCDebug.js

相关函数

函数列表

方法名 作用 参数
cc.log 普通输出 (msg: string/any, …subst: any[])
cc.warn 警告类型输出,chrome中有黄色背景,黄色警告图标
cc.error 错误类型输出,chrome中有红色背景,红色错误图标
cc.assert 断言性输出,当传入的condition为false时才起作用,本质上是cc.error,在调试模式并在chrome中时,会有程序运行挂起的效果,继续运行会跳过后续代码。有助于debug。 (condition?: boolean, …data: any[])

测试代码

onLoad () {
   
  cc.log("这是一条log");
  cc.warn("这是一条warn");
  cc.error("这是一条error");
  cc.log("这是一条log", 111, "其他信息");
  cc.assert(true, "这是第一条assert");
  cc.assert(false, "这是第二条assert");
  cc.log("该行代码被跳过");
},
  
start () {
   
  cc.log("这是一条log start");
},

测试结果

在Cocos Creator中,点击运行预览按钮(工具栏上类似播放键的那个)使用浏览器模式,预览。
image.png
运行到cc.assert(false, “这是第二条assert”);时,被挂起。
image.png
点击顶部蓝色按钮继续运行。

  • 第一条cc.assert中,由于传入第一个参数为true,故没有任何效果。
  • 继续运行后,后续的代码被跳过,但不会影响其他地方的代码,如start()中的输出语句。
  • 输出/运行效果(如颜色)在不同的浏览器/运行环境下可能不同。

代码实现

日志等级(DebugMode)

枚举名 作用
0 NONE 禁止模式,啥也不打印
1 INFO 信息模式,啥都打印
2 WARN 警告模式,警告及以上打印
3 ERROR 错误模式,仅打印错误
4 INFO_FOR_WEB_PAGE 在画面上输出,同INFO(仅WEB端下生效)
5 WARN_FOR_WEB_PAGE 在画面上输出,同WARN(仅WEB端下生效)
6 ERROR_FOR_WEB_PAGE 在画面上输出,同ERROR(仅WEB端下生效)

后面三种模式其实和前面的是一样的,但只有在Web端才生效,因为打印到画面的实现方法是,使用代码动态创建一个HTML节点,并将日志文本输出到节点中,所以在其他端无法使用。

初始化

// CCGame.js		cocos2d\core\CCGame.js
_initConfig (config) {
   
  // 若输入不合法的debugMode 修改为0(DebugMode.NONE 啥等级的也不显示)
  if (typeof config.debugMode !== 'number') {
   
    config.debugMode = 0;
  }
  // 此处省略部分代码
 	// 调用_resetDebugSetting方法进行初始化,此处的debugMode默认为cc.debug.DebugMode.INFO
  // DebugMode.INFO:显示所有日志
  debug._resetDebugSetting(config.debugMode);
}

resetDebugSetting

// CCDebug.js		cocos2d\core\CCDebug.js
module.exports = cc.debug = {
   
  // 此处省略部分代码
    _resetDebugSetting: resetDebugSetting,
}

let resetDebugSetting = function (mode) {
   
    // reset
 		// 重置各个方法,这就是设置日志等级的核心所在。
  	// 重置后再根据mode参数给对应的方法赋值,即实现了只打印部分等级日志。
    cc.log = cc.warn = cc.error = cc.assert = function () {
   };
		
  	// 啥也不打印 所以直接return 哪个方法都不配置
    if (mode === DebugMode.NONE)
        return;
  
		// 当mode大于ERROR的时候 是要将日志打印到画面中
    if (mode > DebugMode.ERROR) {
   
        //log to web page

      	// 把日志打印到游戏画面上
      	// 用代码创建一个div节点,固定在左上角,里面放一个textarea,然后把日志写到textarea里
     		// 日志打印到一个textarea,所以还可以拖动改大小 妙啊
      	// 是不是可以把创建节点的代码挪到外面去?这样就可以不用每次都判断是否存在logList
        function logToWebPage (msg) {
   
            if (!cc.game.canvas)
                return;

            if (!logList) {
   
                var logDiv = document.createElement("Div");
                logDiv.setAttribute("id", "logInfoDiv");
                logDiv.setAttribute("width", "200");
                logDiv.setAttribute("height", cc.game.canvas.height);
                var logDivStyle = logDiv.style;
                logDivStyle.zIndex = "99999";
                logDivStyle.position = "absolute";
                logDivStyle.top = logDivStyle.left = "0";

                logList = document.createElement("textarea");
                logList.setAttribute("rows", "20");
                logList.setAttribute("cols", "30");
                logList.setAttribute("disabled", "tr
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值