用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试。

1 首先在行首加入lua的引用,如下

  1. 1 #include "main.h"
  2. 2 #include "AppDelegate.h"
  3. 3 #include "cocos2d.h"
  4. 4 #include <assert.h>
  5. 5 #include <windows.h>
  6. 6 #include <sys/stat.h>
  7. 7 #include "CCLuaEngine.h"

一、添加引用

2 在main函数前面插入以下代码

  1. 1 #ifdef USE_WIN32_CONSOLE
  2. 2 BOOL g_bAppRun = FALSE;
  3. 3 char g_szBuffer[1024];
  4. 4 char g_szBuffer_copy[1024];
  5. 5 DWORD WINAPI ThreadReadConsole(LPVOID lpParam)
  6. 6 {
  7. 7 HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
  8. 8 while(g_bAppRun)
  9. 9 {
  10. 10 DWORD dwNum = 0;
  11. 11 ReadConsoleA(hConsole, g_szBuffer, 1023, &dwNum, NULL);
  12. 12 if (dwNum)
  13. 13 {
  14. 14 g_szBuffer[dwNum] = '\0';
  15. 15 memcpy(g_szBuffer_copy, g_szBuffer, dwNum + 1);
  16. 16 }
  17. 17 }
  18. 18 return 0;
  19. 19 }
  20. 20
  21. 21 int FetchConsoleCmd(lua_State* L)
  22. 22 {
  23. 23 if ('\0' == g_szBuffer_copy[0])
  24. 24 {
  25. 25 return 0;
  26. 26 }
  27. 27 lua_pushstring(L, g_szBuffer_copy);
  28. 28 g_szBuffer_copy[0] = '\0';
  29. 29 return 1;
  30. 30 }
  31. 31 #endif

main函数前插入代码

3 在main函数里修改如下

  1. 1 #ifdef USE_WIN32_CONSOLE
  2. 2 AllocConsole();
  3. 3 freopen("CONIN$", "r", stdin);
  4. 4 freopen("CONOUT$", "w", stdout);
  5. 5 freopen("CONOUT$", "w", stderr);
  6. 6
  7. 7 g_bAppRun = TRUE;
  8. 8 CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadReadConsole,NULL,0,NULL);
  9. 9 #endif
  10. 10
  11. 11 // create the application instance
  12. 12 AppDelegate app;
  13. 13 lua_State* L = LuaEngine::getInstance()->getLuaStack()->getLuaState();
  14. 14 lua_register(L, "FetchConsoleCmd", FetchConsoleCmd);
  15. 15 int ret = Application::getInstance()->run();
  16. 16
  17. 17 #ifdef USE_WIN32_CONSOLE
  18. 18 FreeConsole();
  19. 19 g_bAppRun = FALSE;
  20. 20 #endif

修改main函数

4 添加lua循环

这里使用计时器,其实可以在主循环中添加操作

  1. 1 cc.Director:getInstance():getScheduler():scheduleScriptFunc(function()
  2. 2 if FetchConsoleCmd then
  3. 3 local string = FetchConsoleCmd()
  4. 4 if string then
  5. 5 local cmd = loadstring(string)
  6. 6 if cmd then
  7. 7 xpcall(cmd, __G__TRACKBACK__)
  8. 8 end
  9. 9 end
  10. 10 end
  11. 11 end, 0, false)

添加循环监听计时器

5 改

  1. 1 local printByte = 36 -- "$"号的内部数字编码
  2. 2 local debug_console = setmetatable({}, {__index = _G})
  3. 3
  4. 4 -- 对输入的字符串进行操作(可自行扩展)
  5. 5 function debug_console:runConsloe()
  6. 6 if FetchConsoleCmd then
  7. 7 self.str = FetchConsoleCmd()
  8. 8 self.isPrint = false
  9. 9 if self.str then
  10. 10 -- 重载 $ 符号的字符串操作
  11. 11 if string.byte(self.str, 1) == printByte then
  12. 12 self.str = string.sub(self.str, 2)
  13. 13 self.str = "return " .. self.str
  14. 14 self.isPrint = true
  15. 15 end
  16. 16
  17. 17 local cmd = loadstring(self.str)
  18. 18 if cmd then
  19. 19 -- 设置函数执行环境
  20. 20 local msg = setfenv(cmd, debug_console)()
  21. 21 if self.isPrint then
  22. 22 print(dump(msg))
  23. 23 end
  24. 24 end
  25. 25 end
  26. 26 end
  27. 27 end
  28. 28
  29. 29 -- 更新文件
  30. 30 function debug_console.updateFile(filePath)
  31. 31 local pos = string.find(filePath,"[^%/.]*$");
  32. 32 local module_name = string.sub(filePath, pos);
  33. 33
  34. 34 local mod = package.loaded[module_name];
  35. 35 if not mod then
  36. 36 mod = package.loaded[module_name.."_manager"];
  37. 37 end
  38. 38
  39. 39 package.loaded[filePath] = false;
  40. 40 local ret = require(filePath);
  41. 41
  42. 42 mod = package.loaded[module_name];
  43. 43 if not mod then
  44. 44 mod = package.loaded[module_name.."_manager"];
  45. 45 end
  46. 46
  47. 47 return ret;
  48. 48 end
  49. 49
  50. 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. 12月12日内容总结——Django之数据增删改查、Django请求生命周期流程图、Django路由层(路由匹配、转换器、正则匹配)、反向解析

    目录 一.可视化界面之数据增删改查 二.django请求生命周期流程图 三.django路由层 1.路由匹配 2.转换器 3.正则匹配 不同版本的区别 正则匹配斜杠导致的区别 4.正则匹配的无名有名分 ...

  2. 二、typora软件的安装与markdown语法

    目录 一.typora软件的安装与使用 1.软件的安装 2.破解使用的方法 3.功能描述(markdown语法讲解) 标题 小标题 语言环境 表格 表情 图片 查看源代码 数学公式 流程图 高亮文本 ...

  3. 在windows系统下用vscode构造shell脚本IDE

    1.基础环境搭建 安装Visual Studio Code(VScode ) 下载地址:https://code.visualstudio.com/Download 下载完双击文件,选择路径安装即可, ...

  4. MD5在Python中的简单使用

    MD5不是加密 https://draveness.me/whys-the-design-password-with-md5/ 参考为什么这么设计 Message-Digest Algorithm 5 ...

  5. javaWeb03-请求转发和请求重定向【包含浏览器与响应编码格式不一致的解决方法】

    本文主要讲述javaWeb的请求转发和请求重定向的区别 一. 请求转发 1. 图解 2. 代码示例 Servlet1的代码示例如下 public class Servlet1 extends Http ...

  6. spring cloud alibaba - Nacos 作为配置中心基础使用

    1.简要说明 Nacos提供了作为配置中心的功能,只需要在Nacos的控制台页面添加配置,然后在项目中配置相应的"路径"就好. 主要分为几个步骤: 在Nacos控制台添加配置 在项 ...

  7. Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧

    实际项目中会运到的 Typescript 回调函数.事件侦听的类型定义,如果刚碰到会一脸蒙真的,我就是 这是第一次我自己对 Typescript 记录学习,所以得先说一下我与 Typescript 的 ...

  8. mac os黑苹果安装

    前言 习惯了mac敲代码的攻城师很难再去适应windows,那么如何在windows上安装苹果系统呢?用黑苹果. 关于黑苹果的安装,网上的一大堆教程显得过于啰嗦,又是安装Unlocker破解mac限制 ...

  9. JZOJ 1083. 【GDOI2006】拯救亚特兰蒂斯

    \(\text{Solution}\) 自己的网络流技术太拉了 连这样的题都做不出来 对于一个怪物,剑术和法术两样东西有一样就可以了 不难想到二分图中最小点覆盖,一条边只有两个端点之一被选就被覆盖了 ...

  10. pytorch学习笔记四之训练分类器

      训练分类器¶   1. 数据¶   处理图像,文本,音频或视频数据时,可以使用将数据加载到 NumPy 数组中的标准 Python 包. 然后,将该数组转换为torch.*Tensor   对于图 ...