上一篇已经完成了Lua调用SDL创建窗口的功能了,めでたしめでたし。但在开始敲游戏代码之前,继续做一个准备工作,添加C++类logger。
       在之前的测试中,控制台上全是白色的输出字,一眼望过去,全是一样,调试的时候很难找到自己想要查看的输出。继续在Ryuujinn工程中添加头文件Logger.h和Logger.cpp文件,在Source文件夹下的Wrap文件中添加LoggerWrap.cpp,没错,Logger也要导出到Lua中。
Logger.h

#pragma onceclass Logger
{
public:/*** 在控制台上输出红色的信息*/static void LogError(const char* fmt, ...);/*** 在控制台上输出黄色的信息*/static void LogWarning(const char* fmt, ...);/*** 在控制台上输出白色的信息*/static void Log(const char* fmt, ...);/*** 修改控制台上输出信息的颜色为红色*/static void SwtichColorToRed();/*** 修改控制台上输出信息的颜色为黄色*/static void SwitchColorToYellow();/*** 修改控制台上输出信息的颜色为白色*/static void SwitchColorToWhite();
};struct lua_State;
namespace LuaWrap
{void RegisterLogger(lua_State* L);
}

Logger.cpp

#include "Logger.h"
#include <stdarg.h>
#include <string>
#include <iostream>
#include <Windows.h>void Logger::LogError(const char* fmt, ...)
{va_list arg;va_start(arg, fmt);char msg[1024] = { 0 };vsprintf_s(msg, 1024, fmt, arg);va_end(arg);SwtichColorToRed();std::cout << msg << std::endl;SwitchColorToWhite();
}void Logger::LogWarning(const char* fmt, ...)
{va_list arg;va_start(arg, fmt);char msg[1024] = { 0 };vsprintf_s(msg, 1024, fmt, arg);va_end(arg);SwitchColorToYellow();std::cout << msg << std::endl;SwitchColorToWhite();
}void Logger::Log(const char* fmt, ...)
{va_list arg;va_start(arg, fmt);char msg[1024] = { 0 };vsprintf_s(msg, 1024, fmt, arg);va_end(arg);std::cout << msg << std::endl;
}void Logger::SwtichColorToRed()
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
}void Logger::SwitchColorToYellow()
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN);
}void Logger::SwitchColorToWhite()
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}

代码实现很简单,就是修改控制台颜色而已,3个输出函数,3个修改颜色函数,也没啥好说的。刚好把之前的输出信息全部替换成Logger中的方法,之前LuaClient中打印堆栈的函数,调用std::cout太多次,不做任何改动,只是在函数执行最开始调用修改颜色函数,将堆栈信息改成黄色。
LoggerWrap.cpp

#include "Logger.h"
#include "LuaClient.h"
#include <iostream>int SwtichColorToRed(lua_State* L)
{Logger::SwtichColorToRed();return 0;
}int SwitchColorToYellow(lua_State* L)
{Logger::SwitchColorToYellow();return 0;
}int SwitchColorToWhite(lua_State* L)
{Logger::SwitchColorToWhite();return 0;
}int LoggerGet(lua_State* L)
{const char* strKey = lua_tostring(L, 2);luaL_getmetatable(L, "LoggerMetaTable");lua_pushvalue(L, 2);lua_rawget(L, -2);if (lua_isnil(L, -1))Logger::LogError("Logger don't have the field: %s.\n%s:%d: in function '%s'", strKey, __FILE__, __LINE__, __FUNCTION__);return 1;
}int LoggerSet(lua_State* L)
{luaL_getmetatable(L, "LoggerMetaTable");lua_pushvalue(L, 2);lua_rawget(L, -2);if (lua_isnil(L, -1)){lua_pop(L, 1);lua_pushvalue(L, 2);lua_pushvalue(L, 3);lua_rawset(L, -3);}else{if (LUA_TFUNCTION == lua_type(L, -1))Logger::LogError("The action is not allowed.\n%s:%d: in function '%s'", __FILE__, __LINE__, __FUNCTION__);else{lua_pop(L, 1);lua_pushvalue(L, 2);lua_pushvalue(L, 3);lua_rawset(L, -3);}}return 0;
}void LuaWrap::RegisterLogger(lua_State* L)
{if (!L) return;lua_newtable(L);luaL_newmetatable(L, "LoggerMetaTable");lua_pushstring(L, "__index");lua_pushcfunction(L, LoggerGet);lua_rawset(L, -3);lua_pushstring(L, "__newindex");lua_pushcfunction(L, LoggerSet);lua_rawset(L, -3);lua_pushstring(L, "SwtichColorToRed");lua_pushcfunction(L, SwtichColorToRed);lua_rawset(L, -3);lua_pushstring(L, "SwitchColorToYellow");lua_pushcfunction(L, SwitchColorToYellow);lua_rawset(L, -3);lua_pushstring(L, "SwitchColorToWhite");lua_pushcfunction(L, SwitchColorToWhite);lua_rawset(L, -3);lua_setmetatable(L, -2);lua_setglobal(L, "Logger");
}

这次并没有把所有函数全部导出到lua中,因为可变参数不太好实现,google也没搜到比较好的解决方案,所以3个输出函数就没有导出。但还是想要这个输出功能,只好在lua稍作改动,在Script文件夹中添加Logger.lua脚本。
Logger.lua

Logger.LogError = function(fmt, ...)Logger.SwtichColorToRed()print(string.format(fmt, ...))Logger.SwitchColorToWhite()
endLogger.LogWarning = function(fmt, ...)Logger.SwitchColorToYellow()print(string.format(fmt, ...))Logger.SwitchColorToWhite()
endLogger.Log = function(fmt, ...)print(string.format(fmt, ...))
end

代码实现还是很简单,利用lua的print函数来实现,而且因为C++那边设置过lua表只会给函数赋值一次的功能,也就表示不能重载Logger.LogError,Logger.LogWarning及Logger.Log函数等。
修改Main.lua测试:

require "Logger"function Main()Logger.Log("Main")--将16进制字符串转换成10进制数字local flag = "00000020"flag = tonumber(flag, 16)Renderer.Init(flag)--这里需要设置lua查找路径gGame = require("Game")gGame.pSDLWindow = Renderer.CreateWindow("Test", 100, 100, 500, 500, 0)gGame.pSDLRenderer = Renderer.CreateRenderer(gGame.pSDLWindow, -1, 0)--while循环中添加print函数是为了避免执行太快,窗口一闪而过local count = 1while count < 10000 docount = count + 1--Logger.LogError(count)endRenderer.DestroyRenderer(gGame.pSDLRenderer)Renderer.DestroyWindow(gGame.pSDLWindow)Renderer.Quit()Logger.LogError("%s is %d, have %f", "jack", 18, 990.0011)Logger.LogWarning("%s is %d, have %f", "jack", 18, 990.0011)Logger.Log("%s is %d, have %f", "jack", 18, 990.0011)
end

得到如下结果,说明添加logger类成功。

源码下载地址

[实战]C++加Lua加SDL来重写龙神录弹幕游戏(3):添加Logger类相关推荐

  1. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(6):只读表

    这次就不急着往下讲解游戏功能了,先来说下lua的功能,因为Unity热更新的问题,导致很多手游都会使用c#加lua来开发,因此有很多新手,或者用lua开发了一两年的程序员,还不是很了解lua,在使用中 ...

  2. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(1):准备

    自学程序加工作好几年了,是时候来练个手了(不算用引擎开发游戏).之前Google学习资料的时候,找到一个弹幕射击游戏的教程,稍微瞄了眼,还挺不错的,但用的是封装的DxLib库,这就不开心了,后面就没看 ...

  3. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(5):添加背景

    敲代码很快,写博客很慢,如果写详细一点,就有点太长了,跟写策划文档没区别了,╮(╯_╰)╭.之前虽然在SDL窗口中显示出了一张人物图片,但也只是为了测试SDL_Image而已.现在就正式来完成这次的工 ...

  4. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(2):Lua创建SDL窗口

    完成了准备工作之后,就可以开始撸代码了.因为项目也不是很大,就打算大部分都用lua来开发.上一篇已经写了一部分测试代码,但都是塞到一个Main.cpp之中,主要是为了测试配置是否成功.这次的工作就要把 ...

  5. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(4):完善Game类

    大部分前期工作都已经完成了,可以正式开始敲游戏代码了.之前显示的都是死循环的窗口,这次终于可以来解决这个问题了,先看看今天的结果.        这次C++中有部分修改的代码,但有了之前的基础,就不花 ...

  6. 【Python_PySide2学习笔记(一)】PySide2动态加载UI方式,重写关闭窗体事件

    ** PySide2设置关闭提示窗口:动态加载UI方式,重写关闭窗体事件 ** ** 前言 ** 转载:https://blog.csdn.net/qq_44703282/article/detail ...

  7. R语言时间序列(time series)分析实战:时序数据加载、绘制时间序列图

    R语言时间序列(time series)分析实战:时序数据加载.绘制时间序列图 目录

  8. css3 特效 加1加2,Bootstrap轮播加上css3动画,炫酷到底!

    很多时候,如果你的项目需要的是一个轻量级的轮播,不需要很多的功能.同时你的项目是采用Bootstrap,(一个最流行的开源前端框架)的话.你可以参考一下bootstrap官方组件. 介绍Animate ...

  9. matlab dwt 多层分解,利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送...

    利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送 mip版  关注:96  答案:2  悬赏:0 解决时间 2021-01-23 13:02 已解决 202 ...

最新文章

  1. Java/Android中实现Shell命令
  2. live555编译:增加CMake支持
  3. 请教大家一个问题,有关于数据库的设计
  4. 凸优化第四章凸优化问题 4.7向量优化
  5. 8086CPU(汇编语言,王爽)
  6. Sparrow 开发板化身电脑音量调节器
  7. 【Java】简单的马戏团节目单项目
  8. 【PAT甲级】1021 Deepest Root (25 分)(暴力,DFS)
  9. 忆享科技聚焦|数字经济、视频云、AI数字人、全球5G用户……行业热点资讯一览
  10. Panorama——H5实现全景图片原理
  11. 如何选择PMP、IPMP、CPMP?
  12. 关于AE渲染高清GIF图片的解决方案
  13. 基于matlab的JPEG彩色图像编码解码源码
  14. 基于guided image filtering的图像去雾 opencv实现
  15. 如何阅读一篇论文-CS230
  16. WAMP启动报The configuration file contains a syntax error
  17. 川师计算机科学学院,喜迎川师萌新——记计算机科学学院2020级新生入学
  18. Redhat7/CentOS7 网络配置与管理(nmtui、nmcli、GNOME GUI、ifcfg文件、IP命令)
  19. 初学者怎样看懂python代码_Python 初学者,如何快速的入门
  20. 单纯形法的计算机方法的实现,线性规划问题中单纯形法的计算机求解.pdf

热门文章

  1. pandas使用unique函数计算dataframe单个数据列中的独特值、或者计算dataframe多个数据列的独特值(get unique values of column or columns)
  2. 纸盒系随身WiFi修改默认分辨率教程
  3. 纯css3炫酷科技感菜单
  4. 修改aapt和自定义资源ID
  5. 荣耀magicwatch2鸿蒙,小猪搞机的评测 篇二十三:荣耀MagicWatch 2 上那些实用小功能盘点 功能还不是一般的丰富...
  6. 初识软件测试之相关模型介绍
  7. vc 生成html,成功从VC++的XML注释生成静态html文档
  8. 程序员,不要让微博占用你太多时间。
  9. Qml基于锚(anchors)的布局
  10. java企业级开发框架