[cocos2dx 3.0 (五)] 使用游戏控制台Console + 添加用户自定义控制台命令
来源:互联网 发布:加内特生涯数据排行 编辑:程序博客网 时间:2024/06/18 06:23
cocos2dx 3.0又出了新版本rc0,在beta2版本中使用Console在vs2012上存在bug,在rc0中已经都修复了,而且加了不少的新的控制台命令。游戏控制台是通过TCP来连接控制的,使用可以让游戏的调试更加方便。
1.使用控制台
先来看一下Console类的一些定义
/** 控制台通过TCP连接可以让开发者更好的控制游戏。它会创建一个新线程去侦听指定的TCP端口。它拥有一个指令分析器,每个指令与一个 std::function<void(int)>相关联。如果这个std::function<>需要使用cocos2d的API,它必须是以下面的形式调用: ``` scheduler->performFunctionInCocosThread( ... ); //使用cocos2d API的部分必须用performFunctionInCocosThread调用 ``` */class CC_DLL Console{public://命令结构:名称、帮助和回调函数 struct Command { const char *name; const char *help; std::function<void(int, const std::string&)> callback; }; /** Constructor */ Console(); /** Destructor */ virtual ~Console(); /** 开始侦听指定端口 */ bool listenOnTCP(int port); /** 从指定描述符开始侦听 */ bool listenOnFileDescriptor(int fd); /** 停止控制台 */ void stop(); /** 添加用户控制台命令 */ void addCommand(const Command& cmd); /** log something in the console */ void log(const char *buf);protected:......}所以使用控制台只需加入一句代码就可以了:
Director::getInstance()->getConsole()->listenOnTCP(5678);端口号可以随意。
然后就可以使用telnet工具来连接使用控制台了。工具在windows系统中也是自带的,但是经过测试后发现,使用这些telnet工具在控制台获取数据时因为格式问题会输出显示的特别乱,所以就自己写了个控制台的客户端,其实很简单:
#include <stdio.h>#include <thread>#include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define MAXLEN 256void wRevc(SOCKET s){char recData[MAXLEN];int len;while(true){len=recv(s, recData, MAXLEN-1, 0);if(len==-1)break;else if(len==0){return ;}else{recData[len] = 0x00;printf(recData);}}printf("已退出连接!\n");}int main(){printf("Cocos2dx Console Client\n请输入控制台端口号:");short port;scanf("%d",&port);WORD sockVersion = MAKEWORD(2,2);WSADATA data; if(WSAStartup(sockVersion, &data) != 0){return 0;}SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET){printf("invalid socket! ");system("pause");return 0;}sockaddr_in serAddr;serAddr.sin_family = AF_INET;serAddr.sin_port = htons(port);serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){printf("连接console失败!\n");closesocket(sclient);system("pause");return 0;}printf("连接console成功!\n");printf("输入\"help\"获取控制台帮助!\n");std::thread t(&wRevc,sclient);t.detach();char sendData[MAXLEN];getchar();while(true){//printf("Enter CocosConsole Command:\n");gets(sendData);if(strcmp(sendData,"consoleExit")==0){printf("退出ConsoleClient!\n");break;}if(strcmp(sendData,"consoleClear")==0)//clear屏幕{system("cls");printf("> ");continue;}strcat(sendData, "\n");send(sclient, sendData, strlen(sendData),NULL);//if(!wRevc(sclient))//break;}closesocket(sclient);WSACleanup();system("pause");return 0;}
上两张测试的图片:
1.查看控制台帮助:
2.查看FileUtils中的数据:
cocos2dx已经定义了很多命令,具体可以看help。
2.添加控制台命令
其实是使用游戏控制台最重要的是定义自己的控制台命令,比如 设置主角的属性,无敌状态,制造物品,查看各种细节数据等等; 这些在调试复杂游戏的时候都是必须的,首先就是要先定义自己的控制台命令。
添加新命令当然也很简单:
#include "cocos2d.h" ... Director::getInstance()->getConsole()->listenOnTCP(5678); ... Console::Command commands={"hello",//命令名称"This is just a user generated command", //说明/*回调函数的第一个参数其实就是socket的句柄,使用send向client发送数据,第2个参数是命令所带的参数字符串。*/[](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);/*如果回调函数中需要使用cocos2d的api就必须在performFunctionInCocosThread函数中调用。...Director::getInstance()->getScheduler()->performFunctionInCocosThread([]{...});...*/}};Director::getInstance()->getConsole()->addCommand(commands);...
测试结果:
cocos2dx的console就学习到这里了!
0 0
- [cocos2dx 3.0 (五)] 使用游戏控制台Console + 添加用户自定义控制台命令
- 添加控制台调试【Console】
- RCP添加控制台Console
- console使用 Chrome控制台
- JS调试console控制台命令
- cocos2dx源码分析:远程控制台Console
- console控制台
- console控制台
- console控制台
- 【MFC】 MFC添加控制台Console进行调试
- 控制台console常用的一些命令
- C#控制台基础 控制台使用console.read读入一个字符
- cocos2dx Win32下添加控制台输出
- laravel 自定义的控制台命令
- js控制台输出console的使用
- websphere 忘记控制台用户名或是添加删除控制台用户
- Rabbitmq 添加用户访控制台(guest无法登陆控制台问题)
- 控制台游戏
- 日志文件归档日志
- 彩色图像目标提取、图像去噪和形态学处理
- 从系统结构来研究虚拟机的设计理念和原理
- 使用 /proc 文件系统来访问 Linux 内核的内容
- hdu2084 数塔
- [cocos2dx 3.0 (五)] 使用游戏控制台Console + 添加用户自定义控制台命令
- Jdev go to file extension
- struts2 1-基础篇
- OpenGL学习笔记---黑屏解决2
- Android通过Get方式提交数据以及乱码处理
- struts2 2-ognl
- 第三周作业——冒泡排序和归并排序
- Ibatis2.0使用说明(一)——入门实例篇
- LeetCode 3Sum