今天我也来发一个控制台游戏。先看图:
缘起
LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园。
这不前几天,看到了魏大师《使用Lua脚本语言开发出高扩展性的系统...》。
LZ对不了解的东西有强迫症,Lua是什么东西,自然是不能放过,要了解一番的。
一番了解下来,好东西啊。最近又比较闲,做个什么东西来练练手吧。
于是又在博客园中,翻到这么一篇《一个控制台小游戏(求点评)》,于是又勾起了我对那个控制台游戏的回忆。点击这里看前辈的作品。
动手
说做就做,总体框架很简单:
用 C#做游戏引擎,用lua开发游戏,C#与Lua之间的交互,则用LuaInterface。
游戏引擎:
解决渲染问题(在控制台上画点、画线、画框等)
响应用户的键盘输入(用户要按键控制游戏)
也是Lua的一个宿主(Lua只是一种语言,不能生成exe一样的宿主)
渲染
通过导出lua函数,使得lua可以调用C#中的函数
lua.RegisterFunction(m.Name, null, m);
实现了如下函数:
可以在控制台指定的位置、使用指定的颜色,进行画点、画矩形、画文字、填充矩形
响应用户输入
用户输入,主要响应了按键输入,鼠标输入暂时不支持
public static void keypress(string key){ if(lua==null) return; LuaFunction func = lua.GetFunction("keypress"); if(func != null) { func.Call(key); } }
需要在lua中定义一个"keypress"的函数,当捕获到用户有按键输入之后,回调该函数
Lua部分
就是实现贪吃蛇,见entry.lua,因为在Program.cs中是调用entry.lua作为入口
lua.DoFile("entry.lua");
重点有以下几个函数
function gameInit()
gameInit 游戏开始后,C#回调这个函数
function gameLoop()
gameLoop 这是一个定时刷新界面的游戏,所以当时间到了之后,C#回调gameLoop,实现重新绘制等操作
感悟
大概花了2天时间写的,lua是入门,C#的控制台部分则主要参考了《控制台小游戏》的实现。
主要目的是学习了C#和lua交互,将来也可以这样,把灵活多变的地方放到lua脚本里来实现。