- 精通Cocos2d-x游戏开发(进阶卷)
- 王永宝
- 1635字
- 2020-11-28 22:37:04
7.1 控制台调试
Cocos2d-x提供了控制台的方式可以调试Cocos2d-x的游戏内容,通过控制台可以在程序运行的时候暂停和恢复,查看当前场景下的节点详情,TextureCache中缓存的纹理,控制fps的开关等,还可以实现一些自定义的命令。
不论游戏是在PC、手机还是Pad上运行,都可以使用控制台进行调试。例如,我们希望知道某个节点是否成功地被添加到场景中,无须调整代码打印日志,可以直接在控制台输入scenegraph命令,即可查看当前场景下的节点详情。
1.开启Console监听
要使用Console进行调试,只需要两个简单的步骤,首先是Console的开启,只需要在AppDelegate中添加以下两行代码即可,通过调用Console的listenOnTCP()方法,可以在指定的端口进行监听。
auto console = director->getConsole(); console->listenOnTCP(5678);
注意:如果使用的端口已经被其他程序占用,则会绑定失败。
2.连接Console
开启了Console的监听之后可以在命令行中使用Telent连接Cocos2d-x程序进行调试。如果是在本地调试,可以直接连接localhost或127.0.0.1;如果是在手机上,需要保证PC和手机之间的网络能够正常连接(如在同一个局域网下)。
如果是在Windows 7系统下,默认是没有开启Telent程序的,可以通过下面这几个简单的步骤来开启Telnet程序。选择“控制面板”→“程序”→“打开或关闭Windows功能”选项,在弹出的对话框中选择“Telnet客户端”,单击“确定”按钮,如图7-1所示。然后就可以在命令行中输入Telnet命令了。
图7-1 开启Telnet
在Mac和Linux下可以直接使用Telnet命令来连接Cocos2d-x程序,如图7-2所示。
图7-2 telnet localhost命令
3.执行指令
在连接上Cocos2d-x程序之后,可以输入各种命令来进行调试,输入的方式是命令名+空格+参数,不同的命令所需的参数不同,输入help可以列出所有的命令以及其相关的命令说明。
4.内置指令
❑ allocator指令可以打印内存分配的诊断信息,需要ccConfig.h中将CC_ENABLE_ALLOCATOR_DIAGNOSTICS宏置为1,然后重新编译,才可以使用这个命令。
❑ config指令可以打印出程序的配置信息,例如,适配策略,设计分辨率的宽和高,是否显示FPS等。
❑ debugmsg指令可以查看当前是否接收调试信息,当附带参数on时可以开启,附带参数off时可以关闭,当开启接收调试信息时,Cocos2d-x程序中打印的日志都会发送到控制台上。
❑ director指令可以控制游戏的暂停、恢复以及结束,可以附带以下参数:pause(暂停)、resume(恢复)、end(结束)、stop(停止)、start(开始)。-h参数或help参数可以查看帮助。
❑ exit指令用于退出控制台。
❑ fileutils指令可以查看当前FileUtils中缓存的所有的绝对路径,flush参数可以清空缓存。
❑ fps指令加上on和off参数可以控制fps的显示。
❑ help指令可以查看帮助。
❑ projection指令可以查看当前的投影方式是3D还是2D,加上2D或3D参数可以改变投影方式。
❑ resolution指令可以查看当前的分辨率以及适配策略,加上宽度、高度、分辨率适配策略这3个参数,可以修改当前的设计分辨率以及适配策略。
❑ scenegraph指令可以查看当前场景的详细内容,包括所有节点的类型、Tag、父子关系,特殊内容等(如Label的文本内容,Sprite的纹理ID等),如图7-3所示。
图7-3 查看场景
❑ texture指令可以查看当前TextureCache中缓存的纹理详情。加上flush参数可以清空TextureCache中的缓存。
❑ touch指令可以模拟触摸,加上tap、x坐标、y坐标3个参数可以模拟在指定的坐标的点击,加上swipe、x1、y1、x2、y2可以模拟从x1、y1坐标拖动到x2、y2坐标。
❑ upload指令加上文件名和经过Base64编码的文件内容,可以将文件上传到Cocos2d-x所在的设备上。
❑ version指令可以查看当前Cocos2d-x的版本。
5.自定义指令
Cocos2d-x内置的指令很难满足丰富的调试需求,所以Cocos2d-x提供了一种便捷的方式可以添加自定义指令来进行扩展,cpp-tests中的Console Test示例演示了如何添加自定义的指令,代码如下。
_console = Director::getInstance()->getConsole(); static struct Console::Command commands[] = { {"hello", "This is just a user generated command", [](int fd, const std::string& args) { const char msg[] = "how are you? \nArguments passed: "; send(fd, msg, sizeof(msg),0); send(fd, args.c_str(), args.length(),0); send(fd, "\n",1,0); }}, }; _console->addCommand(commands[0]);
首先需要获取Console对象,然后构造一个Console::Command对象,再调用Console的addCommand()方法注册添加这个对象,这样就可以在命令行中使用这个命令了。
Command对象由3部分组成,即命令的名字、命令的帮助提示(输入help指令时罗列的帮助信息)、命令的处理回调,该回调会传入一个fd,以及命令的参数字符串,可以调用send()方法将命令执行后的结果发送到控制台中。
如果希望延迟发送,或者在某个时机触发时才发送相关信息给控制台,我们可以使用lambda或者用变量将fd保存起来,然后在合适的时机再调用send()方法发送信息。也可以开启debugmsg,然后通过调用Console对象的log()方法来发送信息给控制台。