用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对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库掌握的不是很多,而且感觉这个样子已经

足够开发使用,就没有深入去研究。

如果以后有机会的话我回去完善这个东西

其中大部分的实现是参照http://yestein.com/2014/09/24/%E3%80%90cocos2d-x%E3%80%91%E6%8E%A7%E5%88%B6%E5%8F%B0%E7%9B%B4%E6%8E%A5%E8%BE%93%E5%85%A5lua%E6%8C%87%E4%BB%A4%E6%94%B9%E8%BF%9B%E7%89%88/中实现的

cocos2d-lua 控制台输入Lua指令方便调试的更多相关文章

  1. Lua基本语法-lua与C#的交互(相当简单详细的例子)

    lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...

  2. Lua 架构 The Lua Architecture

    转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...

  3. VC和VS调用Lua设置以及Lua C API使用。

    通过c++调用lua 脚本,    环境VC++6.0    lua  sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...

  4. 通过lua栈了解lua与c的交互

    lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...

  5. lua脚本之lua语言简介以及lua的安装

    本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...

  6. Java探索之旅(1)——概述与控制台输入

    使用的课本: Java语言程序设计(基础篇)----西电 李娜(译) 原著: Introduction to Java Progrmming(Eighth Edition) -----Y.Daniel ...

  7. java 通过控制台输入的数字打印菱形字母

    package com.rui.test; import java.util.Scanner; /** * @author sunshine * @version 1.0 * @date:2015年1 ...

  8. java控制台输入

    一.java控制台输入 java控制台输入有如下几个方法 1.JDK 1.4 及以下版本读取的方法 JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的 ...

  9. Chrome控制台输入多行js

    Chrome控制台输入多行js 分类: chrome2013-09-08 09:40 342人阅读 评论(0) 收藏 举报 控制台 Chrome控制台中回车默认是执行,要想输入换行,应按Enter+S ...

  10. vJine 第三波 之 Lua 来袭 vJine.Lua

    vJine.Lua vJine.Lua是Lua语言的C#封装库,可实现通过C#直接运行Lua脚本并与Lua脚本交互的功能. 1. 授权: MPL2.0 相关资源: nuget:(https://www ...

随机推荐

  1. JSP第十次作业

    1.实现 删除 回复邮件2.实现阅读邮件功能:在main.jsp中点击任意邮件的标题,进入到detail.jsp显示邮件详情,包括发件人,主题,内容,时间.同时需要把邮件状态修改为已读. com.gd ...

  2. python爬虫学习——列表

    namelist = [] #定义一个空的列表 namelist1 = ["小张","小红","小李"] print(namelist1[0 ...

  3. vue+elementUI 实现设置还款日字母弹窗组件

    1.业务背景 还款业务,设置每月还款日,选每月几号扣款,不需要29.30.31,因为不是每个月都有这三天的 2.预期效果图 3.代码实现 3.1 初始化vue项目 地址:https://cn.vuej ...

  4. JZOJ 2022.07.06【提高组A】模拟

    历程 被暴打了 原因是钻进了 \(T4\) 的坑中... 先看完题,发现 \(T4\) 比较有意思,\(T2\) 没有想法 \(T3\) 挺容易,做法似乎很好想 \(T1\) 送分,十几分钟搞定 然后 ...

  5. JZOJ 5352. 【NOIP2017提高A组模拟9.7】计数题

    题目 分析 考虑 \(kruskal\) 的过程 我们选边从高位开始 当前位为 \(0\) 的放一边,为 \(1\) 的放另一边 将 \(0\) 的建一棵字典树, \(1\) 的匹配 因为是异或,那就 ...

  6. 内网安全之:MS14-068 Kerberos 域用户提权漏洞

    内网安全之:MS14-068 Kerberos 域用户提权漏洞 目录 内网安全之:MS14-068 Kerberos 域用户提权漏洞 0 漏洞说明 (MS14-068:CVE-2014-6324) 1 ...

  7. Linux提权之:利用capabilities提权

    Linux提权之:利用capabilities提权 目录 Linux提权之:利用capabilities提权 1 背景 2 Capabilities机制 3 线程与文件的capabilities 3. ...

  8. 如何在电脑上配置Vue开发环境

    一,开发环境 : Node JS(npm) Visual Studio Code(前端IDE) 安装NodeJS 下载地址: nodejs中文网 Visual Studio Code 官网下载地址 h ...

  9. npm+react linux 开荒

    安装npm 从 https://nodejs.org/dist/ 找到下载包,并不是版本越高越好,得看项目的需要. 解压之后,将解压路径bin添加到PATH里. 完成后可配置npm源 npm inst ...

  10. uniapp开发使用 web-view APP 与 H5 (vue)通信

    需求:这边是uniapp开发的APP  需要内嵌H5(vue),就得使用web-view跳转网页 H5端 在vue的index,html文件引入web-view的插件 <script type= ...