- 精通Cocos2d-x游戲開發(進階卷)
- 王永寶
- 1635字
- 2020-11-28 22:37:03
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()方法來發送信息給控制臺。