控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏。先看图:


缘起
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脚本里来实现。
下载
控制台游戏引擎CGE——贪吃蛇的更多相关文章
- Love2D游戏引擎制作贪吃蛇游戏
代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义
每个游戏都有一个很明确的目的或者说游戏主题,贪吃蛇的目的很明确:蛇找到并吃掉食物.只有目的是很无聊的,算不上一个好游戏.所以设计者增加了创意:1. 吃掉食物后蛇会增长:2. 吃掉食物后分数会增加.有些 ...
- 使用Love2D引擎开发贪吃蛇游戏
今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...
- H5游戏开发:贪吃蛇
贪吃蛇的经典玩法有两种: 积分闯关 一吃到底 第一种是笔者小时候在掌上游戏机最先体验到的(不小心暴露了年龄),具体玩法是蛇吃完一定数量的食物后就通关,通关后速度会加快:第二种是诺基亚在1997年在其自 ...
- C++控制台应用程序之贪吃蛇(改进版)
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> #in ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(六) - 蛇实现
这一篇是关于设置蛇的属性的,接上一篇(五). 设置蛇的速度,很简单,只要不是负数就行了. void SNK_SetSnakeSpeed(Snake *snake, int speed) { ) sna ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现
由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义
蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结, ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义
游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没 ...
随机推荐
- Abp集成Swagger的最佳实践
1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...
- The current identity (NT AUTHORITY/NETWORK SERVICE)
IIS错误提示: The current identity (NT AUTHORITY/NETWORK SERVICE) does not have write access to 'C:/WINDO ...
- C++ 之namespace常见用法
一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...
- 通过openswan基于Azure平台搭建VPN server
用过Azure的读者都知道,Vnet一直是Azure比较自豪的地方,尤其是VPN,Azure提供了两种VPN以及专线来保证客户数据的安全性,S2S vpn(站点到站点的,基于IPsec的),P2S v ...
- ubuntu14.04下搭建python+mysql环境
简略记录ubuntu14.04下搭建python操作的mysql服务器的过程和其中遇到的问题及解决方法. 第一部分: 安装mysql 安装步骤:1. sudo apt-get install mysq ...
- MySQL索引类型总结和使用技巧以及注意事项
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...
- webpack那些事儿
webpack那些事儿01-webpack到底是什么 webpack那些事儿02-从零开始 webpack那些事儿03-热插拔 hot webpack那些事儿04-spa项目实战分析 webpack那 ...
- ifram-locatione页面跳转
在涉及银行页面时,需要跳转到银行页面var accound = document.getElemntById('accound');$.ajax({ dataType:'json', type:'po ...
- JavaFx导出文件
导出文件格式可选 protected void handExportDateAction(ActionEvent event) { // ShowDialog.showConfirmDialog(FX ...
- HTTP Header 详解
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应.就整个网络资源传 ...