翻译:北京理工大学 20981 陈罡
呵呵,给moto演示过之后,他们提出一个很让人郁闷的问题,能否内嵌小游戏或者支持flash游戏。
这是一个很令人头疼的事情,在一个程序里面内置游戏,涉及到很多方面的开发。而且游戏又最好是
可以动态更新的那种,确实提出了一个不大不小的挑战。如何实现呢?实现一个jvm肯定是不可能的了,
整个程序会大得要死,而且也会慢的要死;采用程序覆盖后替换的方法呢,看上去也行,但是修改和
发布比较麻烦,而且注定是用c\c++去开发,一个简单的小游戏可能就需要开发很久,但是很多游戏
都是千篇一律的东西,基本的键盘映射,触摸屏消息,贴图,声音,数据存盘、读取仅此而已,已经
比较标准了;采用flash 6格式的flash呢,这种可以在flash软件里面做游戏,然后放到手机上玩,
应该是最理想的一种方式,顺便连游戏的编辑器也有了(呵呵,人家“免费”提供的)。不过,看看
flash 6的文件格式解析和在屏幕上还原的工作量,确实可以让人郁闷一会儿了。
于是目光转向了网游,想想看,人家的游戏那么多场景,那么复杂,如果都重头来的话,每一关不是
要把这帮开发人员累死。。。很多网游都是一样的,杀人,练级,只是图片稍许不同。也许这就是
所谓的游戏引擎了。
开发pc上的一个游戏引擎谈何容易,不过回过头来,不妨假设一下,已经有了游戏引擎,该如何用呢?
无非就是写几个游戏关卡,场景的脚本,替换几张图而已。。。呵呵,这一下给我了一些灵感,这些
常规性质的工作,完全可以通过脚本来做。而且手机,不要求太复杂和冗长的游戏,只要简简单单就
行了。找一个脚本引擎,然后集成在程序里面,把手机的常规操作例如绘图,声音,触摸屏,按键,
贴图,文件保存,读取甚至联网,几个基本功能做成脚本可以随意调用的模块。
在这以后,通过更新脚本,就可以改变关卡和图片,大大简化了手机游戏的开发,而且可以实现在
应用里面嵌入小游戏的想法,而且可以更加理想的扩展应用的功能,通过脚本修改应用的主题。
呵呵,想法虽好,但是需要技术的支持才行。
于是。。。开始了Lua之旅。。。
Lua 5.0 参考手册
翻译:北京理工大学 20981 陈罡
1、介绍
Lua在葡萄牙语里意思是“月亮”,发音是LOO-ah,中文发音是“卢--啊”。
Lua是一种面向过程的扩展编程语言,具有方便的数据描述方法和很强的通用性。
尽管如此,它也为面向对象编程,面向功能编程,以及数据驱动编程等编程模式,
提供了很好的支持。Lua可以做为一个强大的轻量级的配置脚本语言来辅助、扩展
多种编程语言。
Lua本身采用“干净”的C语言编写(干净意味着,它是ANSI C和C++的字集),做为
一个可集成在程序中的独立的库存在。
做为一种扩展语言,Lua没有main()函数声明。它只是“嵌入”在宿主程序中做为
宿主程序的一部分。嵌入Lua库后,宿主程序能够调用和执行Lua脚本代码、能够
修改和读取Lua脚本中的变量,可以指定Lua脚本中调用的并且由宿主程序定义的
C语言函数。通过在Lua脚本中调用宿主程序的C语言函数,Lua可以胜任大量不同
领域的任务,甚至可以成为一个强大的框架控制脚本。
Lua发布版本中有一个独立的叫做lua的程序,它就是一个嵌入了Lua库的宿主程序,
可以调用和执行外部传入的Lua脚本。
Lua是一个免费软件,只要声明Lua的版权声明就可以任意使用。本手册的可以从
Lua的官方网站:上获取到。
与其它的参考手册一样,这篇文档是纯描述性的简单文档。如果希望探讨Lua的设计
和实现方面的问题,请参考下面的文章(这些文章可以在Lua官方网站上找到):
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.
Lua---an extensible extension language.
Software: Practice & Experience 26 #6 (1996) 635-652.
L. H. de Figueiredo, R. Ierusalimschy, and W. Celes.
The design and implementation of a language for extending applications.
Proceedings of XXI Brazilian Seminar on Software and Hardware (1994) 273-283.
L. H. de Figueiredo, R. Ierusalimschy, and W. Celes.
Lua: an extensible embedded language. Dr. Dobb's Journal 21 #12 (Dec 1996) 26-33.
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.
The evolution of an extension language: a history of Lua,
Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14-B-28.
2、语言介绍
本节描述Lua的词法、语法以及语意学定义。换句话说,本节描述了如何调用Lua是
合法的,语句之间是如何合并的以及语句合并以后的含义是什么。
语法构成采用BNF(巴科斯-诺尔范式)描述:
{a}意思是0,或者属于a的属性或方法,
[a]意思是可选的a,
关键字用bold加粗表示,
非终端字符用italics斜体表示,
终端字符用typewriter字体表示,并用引号引起来
2.1、词法约定
Lua中的变量标志符为任意由字母、数字、下划线且首字母不是数字的字符串
构成。这符合多数语言的语法定义(尤其是标准C语言)。
下面是关键字定义,关键字不可用于变量定义:
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while
Lua是一种区分变量大小写的语言(仍然可类比标准C语言),例如:
and是Lua的保留字不可用于变量声明,但是And和AND就可以用于两个不同
的变量声明。
Lua词法的强制性约定:
如果变量第一个字符由下划线开始“_”,并且后续字母均为大写字母,
(例如,_VERSION)做为Lua的内部保留变量存在。在用户自定义变量
的时候这一点要格外注意。
下面是Lua的运算符:
+ - * / ^ =
~= <= >= < > ==
( ) { } [ ]
; : , . .. ...
下面是类比C语言printf()的格式化输出用的特殊字符表示:
\a --- 系统响铃一声
\b --- 退格
\f --- form feed
\n --- 回车并换行
\r --- 回车
\t --- 横向tab(8个字符)
\v --- 纵向tab(8个字符)
\\ --- 反斜杠符号
\" --- 双引号符号
\' --- 单引号符号
\[ --- 左方括号
\] --- 右方括号
'\newline'也可代表回车换行。字符串可以使用数字表示'\ddd',其中
的ddd代表三个十进制数字。在Lua中的字符串可以容纳8 bit的ascii字符,
包括嵌入的0,可以用'\0'来表示。
如果需要输出格式化字符串,可以用两个匹配的方括号将格式化字符串括起来
[[...]]。例如:
print "abc\n123\""
输出的结果是:
abc
123"
需要在屏幕上直接输出"abc\n123\""格式化字符串的话,则只需要:
print [["abc\n123\""]]
加上两个匹配的方括号即可。
数字常量的表示方法,为可选的十进制部分和小数部分或科学计数法,例如:
3 3.0 3.1416 314.16e-2 0.31416E1
脚本注释采用字符串前面加入两个减号(-- hello world)来表示单行注释。
多行注释,可以采用(--[[....]])来表示,例如:
(1)单行注释:
-- this is a test
(2)多行注释:
--[[ this is
a test comments]]
注意,多行注释,--后直接跟[[,不要加空格。
为了方便起见(针对于*nix系统),如果脚本第一行以“#”开头,将被忽略。
2.2数据和数据类型
Lua是一个动态数据类型语言。这意味着所有变量无需数据类型定义,只有数据的值
存在于内存中。(注,这一点有别于强数据类型定义的C语言),所有的变量根据其
存储的数据被Lua自动设定其数据类型。
在Lua中有8中基本的数据类型:
nil, boolean, number, string, function, userdata, thread, table
Nil:用于表示当前变量没有赋给有效的数据
Boolean:只存放true和false两种数值,在Lua中,nil和false都会引起
条件判断结果为false,其它的值都会引起条件结果为true。
Number:表示一个浮点数(类似于C语言的double或float)。
String:表示一个8位的ascii字符串,包括嵌入的0('\0')。
函数Function也是Lua中的值类型的一种,意味着函数在Lua中是跟变量一样存储
的,可以想普通的参数一样传递给其它的函数,也可以做为一个函数的返回值
返回给调用者。Lua可以既可以调用采用Lua脚本编写的函数,也可以调用采用C
语言编写的函数。
Userdata:用于支持把任意C语言的数据保存在Lua的变量中。该类型把Lua没有
预定义过的一整块raw内存暂时存储起来,通常与metatables一同使用,而metatable
则会定义Userdata的处理方法和函数。userdata常用来给C语言函数传递结构体指针,
存放处理所需参数和处理结果。userdata在Lua中无法被修改。
Thread:代表在Lua中独立的执行线程,通常用于实现协作任务。
Table:用于表示Lua中的数组,该table不光可以采用数字做为索引,也可以用除nil
外的任意数值做为索引,同时table也可以存放各种不同数据类型的数值(nil除外),
table存储结构是Lua的核心,它可以用来存储原始数组,符号表,集合,记录,表
树,图等等。Lua可以允许用filed的名称来表示数据,例如:a.name等同于a["name"]。
在Lua中有很多方便的方法可以创建table,详见2.5.6。
table可以用来存放function型的变量,可以构建字自己的方法数组。
tbles, functions, userdatas都是对象,因此,变量通常不存放其数值,只是对其的
引用。在赋值和参数传递过程,函数返回这些情况下,通常都是引用的传递,不会涉及
到任何形式的值的拷贝。
Lua的库函数type()会以字符串形式返回给定值的数据类型。(详见5.1)
2.2.1类型转换问题
Lua提供了字符串与数字之间的全自动的运行时类型转换。任何数学运算
都会让Lua尝试将字符串转换成数字;同理,当需要一个字符串类型的时
候,会自动将数字类型转换为字符串类型。
如果需要完全控制数字转换成字符串的格式,需要使用字符串的format()
函数。(详见5.3节)
今天先翻译这么多,有没有已经翻译好的Lua V5.0的文档啊,hoho懒得敲那么多字。
ps:
5mbox for e680的版本移植已经成功,正在内测。。。呵呵,相信不久就会和朋友们见面。