用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对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. mysql-01数据库基本简介

    1.数据库的概念 DB:数据库(database):存储数据的"仓库".它保存了一系列有组织的数据. DBMS:数据库管理系统(Database Management System ...

  2. ChatGPT国内镜像模板,国内使用ChatGPT中文版本

    @ 目录 一.什么是ChatGPT国内镜像 二.ChatGPT国内镜像使用教程 免费ChatGPT镜像的功能: 三.ChatGPT中文版作用 四.怎么使用ChatGPT国内镜像 五.中文ChatGPT ...

  3. JZOJ 3745. 【NOI2014模拟7.14】Problem A

    \(\text{Problem}\) 我们有一个树,大小为 \(n\). 考虑树上的一条路径,如果一个边的两个点都在这路径上,我们称这个边属于这个路径,如果一个边有且只有一个点在这路径上,我们称这个边 ...

  4. Cesium源码阅读环境搭建

    1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...

  5. redis(13)持久化操作-AOF

    AOF(Append Only File) 以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来 (读操作不记录), 只许追加文件但不可以改写文件,redis 启动之初 ...

  6. AD域

    一.介绍 [域] 存放在 [活动目录] 存放在 [域控制器] 二.域和活动目录的规划 三.安装域控制器

  7. C#/VB.NET 如何在 Word 文档中添加页眉和页脚

    页眉位于文档中每个页面的顶部区域,常用于显示文档的附加信息,可以插入时间.图形.公司微标.文档标题.文件名或作者姓名等:页脚位于文档中每个页面的底部的区域,常用于显示文档的附加信息,可以在页脚中插入文 ...

  8. 开发者进阶必备的9个Tips & Tricks!

    优秀的开发人员市场前景是十分广阔的,但想找到一份理想的工作,仅有代码知识是不够的.优秀的工程师应该是一个终身学习者.问题的创造性解决者,着迷于整个软件世界.要成为一名优秀的开发者,应该具备哪些品质并做 ...

  9. Linux的终端(base),进入base环境

    正常界面,如下 带有(base) 一般是由于安装了conda环境管理软件,它自带一个base环境.第一次安装时出现这种情况可能是由于软件将启动base环境的命令写入-/.bashrc 文件,这就相当于 ...

  10. C# 图片压缩(指定大小压缩和指定尺寸压缩)

    一按大小压缩测试代码: 一测试效果: 一主要代码: /// <summary> /// 压缩图片至200 Kb以下 /// </summary> /// <param n ...