cocos2d-lua 控制台输入Lua指令方便调试
用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试。
1 首先在行首加入lua的引用,如下
- 1 #include "main.h"
- 2 #include "AppDelegate.h"
- 3 #include "cocos2d.h"
- 4 #include <assert.h>
- 5 #include <windows.h>
- 6 #include <sys/stat.h>
- 7 #include "CCLuaEngine.h"
一、添加引用
2 在main函数前面插入以下代码
- 1 #ifdef USE_WIN32_CONSOLE
- 2 BOOL g_bAppRun = FALSE;
- 3 char g_szBuffer[1024];
- 4 char g_szBuffer_copy[1024];
- 5 DWORD WINAPI ThreadReadConsole(LPVOID lpParam)
- 6 {
- 7 HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
- 8 while(g_bAppRun)
- 9 {
- 10 DWORD dwNum = 0;
- 11 ReadConsoleA(hConsole, g_szBuffer, 1023, &dwNum, NULL);
- 12 if (dwNum)
- 13 {
- 14 g_szBuffer[dwNum] = '\0';
- 15 memcpy(g_szBuffer_copy, g_szBuffer, dwNum + 1);
- 16 }
- 17 }
- 18 return 0;
- 19 }
- 20
- 21 int FetchConsoleCmd(lua_State* L)
- 22 {
- 23 if ('\0' == g_szBuffer_copy[0])
- 24 {
- 25 return 0;
- 26 }
- 27 lua_pushstring(L, g_szBuffer_copy);
- 28 g_szBuffer_copy[0] = '\0';
- 29 return 1;
- 30 }
- 31 #endif
main函数前插入代码
3 在main函数里修改如下
- 1 #ifdef USE_WIN32_CONSOLE
- 2 AllocConsole();
- 3 freopen("CONIN$", "r", stdin);
- 4 freopen("CONOUT$", "w", stdout);
- 5 freopen("CONOUT$", "w", stderr);
- 6
- 7 g_bAppRun = TRUE;
- 8 CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadReadConsole,NULL,0,NULL);
- 9 #endif
- 10
- 11 // create the application instance
- 12 AppDelegate app;
- 13 lua_State* L = LuaEngine::getInstance()->getLuaStack()->getLuaState();
- 14 lua_register(L, "FetchConsoleCmd", FetchConsoleCmd);
- 15 int ret = Application::getInstance()->run();
- 16
- 17 #ifdef USE_WIN32_CONSOLE
- 18 FreeConsole();
- 19 g_bAppRun = FALSE;
- 20 #endif
修改main函数
4 添加lua循环
这里使用计时器,其实可以在主循环中添加操作
- 1 cc.Director:getInstance():getScheduler():scheduleScriptFunc(function()
- 2 if FetchConsoleCmd then
- 3 local string = FetchConsoleCmd()
- 4 if string then
- 5 local cmd = loadstring(string)
- 6 if cmd then
- 7 xpcall(cmd, __G__TRACKBACK__)
- 8 end
- 9 end
- 10 end
- 11 end, 0, false)
添加循环监听计时器
5 改
- 1 local printByte = 36 -- "$"号的内部数字编码
- 2 local debug_console = setmetatable({}, {__index = _G})
- 3
- 4 -- 对输入的字符串进行操作(可自行扩展)
- 5 function debug_console:runConsloe()
- 6 if FetchConsoleCmd then
- 7 self.str = FetchConsoleCmd()
- 8 self.isPrint = false
- 9 if self.str then
- 10 -- 重载 $ 符号的字符串操作
- 11 if string.byte(self.str, 1) == printByte then
- 12 self.str = string.sub(self.str, 2)
- 13 self.str = "return " .. self.str
- 14 self.isPrint = true
- 15 end
- 16
- 17 local cmd = loadstring(self.str)
- 18 if cmd then
- 19 -- 设置函数执行环境
- 20 local msg = setfenv(cmd, debug_console)()
- 21 if self.isPrint then
- 22 print(dump(msg))
- 23 end
- 24 end
- 25 end
- 26 end
- 27 end
- 28
- 29 -- 更新文件
- 30 function debug_console.updateFile(filePath)
- 31 local pos = string.find(filePath,"[^%/.]*$");
- 32 local module_name = string.sub(filePath, pos);
- 33
- 34 local mod = package.loaded[module_name];
- 35 if not mod then
- 36 mod = package.loaded[module_name.."_manager"];
- 37 end
- 38
- 39 package.loaded[filePath] = false;
- 40 local ret = require(filePath);
- 41
- 42 mod = package.loaded[module_name];
- 43 if not mod then
- 44 mod = package.loaded[module_name.."_manager"];
- 45 end
- 46
- 47 return ret;
- 48 end
- 49
- 50 return debug_console
改写lua函数
这样一来,配合一些全局函数,可以在游戏开发时对游戏实现简单的指令调试,大大节省游戏开发时间,特别是对于我这些初学者来说,每次一个bug要去找好久,甚至在每行都加入print函数去查找问题出在哪。
但是这样的弊端在于取不到包中定义的局部变量,具体的实现需要利用lua debug库中的debug.getupvalue()和debug.setupvalue()来实现,由于技术有限,本身对于lua 的debug库掌握的不是很多,而且感觉这个样子已经
足够开发使用,就没有深入去研究。
如果以后有机会的话我回去完善这个东西
cocos2d-lua 控制台输入Lua指令方便调试的更多相关文章
- Lua基本语法-lua与C#的交互(相当简单详细的例子)
lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...
- Lua 架构 The Lua Architecture
转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...
- VC和VS调用Lua设置以及Lua C API使用。
通过c++调用lua 脚本, 环境VC++6.0 lua sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...
- 通过lua栈了解lua与c的交互
lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...
- lua脚本之lua语言简介以及lua的安装
本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解. 一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...
- Java探索之旅(1)——概述与控制台输入
使用的课本: Java语言程序设计(基础篇)----西电 李娜(译) 原著: Introduction to Java Progrmming(Eighth Edition) -----Y.Daniel ...
- java 通过控制台输入的数字打印菱形字母
package com.rui.test; import java.util.Scanner; /** * @author sunshine * @version 1.0 * @date:2015年1 ...
- java控制台输入
一.java控制台输入 java控制台输入有如下几个方法 1.JDK 1.4 及以下版本读取的方法 JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的 ...
- Chrome控制台输入多行js
Chrome控制台输入多行js 分类: chrome2013-09-08 09:40 342人阅读 评论(0) 收藏 举报 控制台 Chrome控制台中回车默认是执行,要想输入换行,应按Enter+S ...
- vJine 第三波 之 Lua 来袭 vJine.Lua
vJine.Lua vJine.Lua是Lua语言的C#封装库,可实现通过C#直接运行Lua脚本并与Lua脚本交互的功能. 1. 授权: MPL2.0 相关资源: nuget:(https://www ...
随机推荐
- 12月12日内容总结——Django之数据增删改查、Django请求生命周期流程图、Django路由层(路由匹配、转换器、正则匹配)、反向解析
目录 一.可视化界面之数据增删改查 二.django请求生命周期流程图 三.django路由层 1.路由匹配 2.转换器 3.正则匹配 不同版本的区别 正则匹配斜杠导致的区别 4.正则匹配的无名有名分 ...
- 二、typora软件的安装与markdown语法
目录 一.typora软件的安装与使用 1.软件的安装 2.破解使用的方法 3.功能描述(markdown语法讲解) 标题 小标题 语言环境 表格 表情 图片 查看源代码 数学公式 流程图 高亮文本 ...
- 在windows系统下用vscode构造shell脚本IDE
1.基础环境搭建 安装Visual Studio Code(VScode ) 下载地址:https://code.visualstudio.com/Download 下载完双击文件,选择路径安装即可, ...
- MD5在Python中的简单使用
MD5不是加密 https://draveness.me/whys-the-design-password-with-md5/ 参考为什么这么设计 Message-Digest Algorithm 5 ...
- javaWeb03-请求转发和请求重定向【包含浏览器与响应编码格式不一致的解决方法】
本文主要讲述javaWeb的请求转发和请求重定向的区别 一. 请求转发 1. 图解 2. 代码示例 Servlet1的代码示例如下 public class Servlet1 extends Http ...
- spring cloud alibaba - Nacos 作为配置中心基础使用
1.简要说明 Nacos提供了作为配置中心的功能,只需要在Nacos的控制台页面添加配置,然后在项目中配置相应的"路径"就好. 主要分为几个步骤: 在Nacos控制台添加配置 在项 ...
- Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧
实际项目中会运到的 Typescript 回调函数.事件侦听的类型定义,如果刚碰到会一脸蒙真的,我就是 这是第一次我自己对 Typescript 记录学习,所以得先说一下我与 Typescript 的 ...
- mac os黑苹果安装
前言 习惯了mac敲代码的攻城师很难再去适应windows,那么如何在windows上安装苹果系统呢?用黑苹果. 关于黑苹果的安装,网上的一大堆教程显得过于啰嗦,又是安装Unlocker破解mac限制 ...
- JZOJ 1083. 【GDOI2006】拯救亚特兰蒂斯
\(\text{Solution}\) 自己的网络流技术太拉了 连这样的题都做不出来 对于一个怪物,剑术和法术两样东西有一样就可以了 不难想到二分图中最小点覆盖,一条边只有两个端点之一被选就被覆盖了 ...
- pytorch学习笔记四之训练分类器
训练分类器¶ 1. 数据¶ 处理图像,文本,音频或视频数据时,可以使用将数据加载到 NumPy 数组中的标准 Python 包. 然后,将该数组转换为torch.*Tensor 对于图 ...