官术网_书友最值得收藏!

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()方法來發送信息給控制臺。

主站蜘蛛池模板: 延边| 清水河县| 孝感市| 汕头市| 常宁市| 龙山县| 方正县| 珲春市| 莲花县| 吴江市| 徐汇区| 磴口县| 万山特区| 婺源县| 林西县| 崇州市| 黄平县| 萍乡市| 巴里| 古田县| 枣强县| 蓝山县| 元朗区| 云霄县| 钟祥市| 肇庆市| 马尔康县| 琼中| 清徐县| 日照市| 镇远县| 湘阴县| 辰溪县| 伊川县| 绥滨县| 晋州市| 通州区| 华池县| 南和县| 巴楚县| 嘉黎县|