Lua与网络游戏

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Lua的基本语法
基本类型 • nil 一个变量没赋值前默认值是nil,给变量赋nil可 以删除该变量,相当于C++中的Null • boolean 只有false和nil为假,其他值都为真 number 数值型, 相当于int,long,short,double等 • string 用法'a' "aa" , • function function(a,b) return a + b end • thread 线程,协同函数 • table {1,2,3,4} {x=2, y=3} • userdata 用户数据 允许Lua变量存储定制的 C++ 数据
Lua中唯一的数据结构:Table
• Lua的tables实现了类似Python里面Tuple的功能, 不仅可以通过数字下标检索数据,还可以通过别的 类型的值检索数据。 • Lua中除了nil以外的类型都可以作为tables的索引 下标. • tables没有固定的大小,你可以根据需要动态的 调整他的大小. • tables是Lua主要的也是唯一的数据结构, 可以通 过他实现传统数组, 符号表, 集合, 队列,以及其他 的数据结构
if( lua_isstring(L,-1) ) print(“string”); if(lua_isnumber(L,-2) print(“number”); if( lua_isboolean(L,-3)) print(“bool”):
Lua与C++交互:栈
• 为了从栈中获得值,这里有lua_to*函数: lua_Number (lua_tonumber) (lua_State *L, int idx); lua_Integer (lua_tointeger) (lua_State *L, int idx); int (lua_toboolean) (lua_State *L, int idx); const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); lua_CFunction (lua_tocfunction) (lua_State *L, int idx); void* (lua_touserdata) (lua_State *L, int idx);
Lua 的控制结构
• If then else end if a < b then a = 0 end • while do end while I < 10 do i=i+1 end repeat until repeat I = i+1 until I >=10 for var = exp1,exp2,exp3 do for I = 0 , 10, 1 do print i end


一个链表的实现
• • • • • • • • • • • • • • • • • • • • • list=nil insert=function(v) list={lnext=list,data=v} End printlist=function() local l=list while l do print(l.data) l=l.lnext end End del_elem=function(v) local l=list while l~=nil do if l.lnext.data==v then l.lnext=l.lnext.lnext break; end l=l.lnext end end
• 多态
Lua行为的规则是:如果表中含此行为,就用当前表的行为,如果没有,就 从元表中查找行为,依次递归 Class C Class B Class A metatable metatable metatable int Sub () int Add() int Add() I
Lua面向对象-元表
Lua与网络游戏
管传淇
Lua与现在的游戏
• 现在有哪些来自百度文库戏用Lua
暴雪 魔兽世界 UBI 孤岛惊魂(Far Cry) 网易 大话系列 完美 神鬼传奇,降龙之剑 金山 剑网3 畅游 天龙八部 巨人 征途,巨人
• 主要运用在哪些方面
UI插件 客户端的图像控制 任务系统 AI系统 伤害计算
Lua的特点
• • index 为栈中的索引 实例: char* szStr = lua_tostring(L,-1); int num = lua_tonumber(L,-2); bool bSuc = lua_toboolean(L,-3);
Lua与C++交互:栈
Lua中的函数
• Function 函数名(参数1,参数2) • 函数体 • End • 函数名 = Function(参数1,参数2) • 函数体 • End
• • • • • • • Example: Function PrintHelloWorld() Print “Hello,world” End PrintHelloWorld = function() Print “Hello,world” end
….
– 例: lua_pushboolean(L,false); lua_pushnumber(L, 200); lua_pushstring(L,”hello,world”);
Lua与C++交互:栈
• API提供了一套lua_is*函数来检查一个元素是否是一个指定的类型,* 可以是任何Lua类型。因此有lua_isnumber,lua_isstring,lua_istable以 及类似的函数。所有这些函数都有同样的原型: int lua_is… (lua_State *L, int index); • 如lua_isnumber和lua_isstring • index 为栈中的索引 实例:
Table实例
• • • • • a = {} a[“x”] = 10 a[20] = "great“ myPolygon = { color=“blue”, thickness=2, npoints=4; {x=0,y=0}, {x=-10, y=0}, {x=-5,y=4}, {x=0,y=4} }
Lua与C++
• Lua的C库提供一系列API: * 管理全局变量 * 管理tables * 调用函数 * 定义新函数 * 垃圾收集器GC * 载入并执行Lua程序 • 任何Lua可以实现的功能, 都可以通过Lua的C API 实现, 这对于优化程序的运行速度 有帮助. 经常调 用的共用的Lua程序片断可以转成C程序, 以提高 效率. 连Lua都是C写的
Lua中的面向对象
• Lua没有类的概念,但可以用其他方法模拟 • Lua中面向对象是用元表这种机制来模拟的
元表是什么?
元表是普通的Lua表 定义了在特定操作下表的行为 设置元表的表自动继承了元表的行为 元表能设置自己的元表来继承其他表的行为
Lua面向对象的模拟
• 继承
通过改变表的元表来继承其他表的行为 Class B Class A metatable metatable Class C metatable
• Lua在这脚本语言中是运行时速度最快而且 占内在最少的。 • 集成Lua只会增加极少的内存占用率 • Lua容易地通过C/C++ 集成在软件里 • 快,轻巧
表达式 • 算法运算符: 二元运算符:+-*/^ (加减乘除幂) • 一元运算符: -(负值) • 关系运算符: < > <= >= == ~= • 逻辑运算符: and or not • 连接运算符: ..
Lua与C++交互:栈
• API有一系列压栈的函数,它将每种可以用C来描述的Lua类型压栈: 空值(nil)用lua_pushnil,数值型(double)用lua_pushnumber, 布尔型(在C中用整数表示)用lua_pushboolean,C语言风格(以” 结束)的字符串用lua_pushstring,用户的自定义数据用 lua_pushuserdata • void lua_pushnil (lua_State *L); void lua_pushboolean (lua_State *L, int bool); void lua_pushnumber (lua_State *L, double n); void lua_pushstring (lua_State *L, const char *s); void lua_pushuserdata(lua_State *L, void* p);
• 无论你何时想要从Lua请求一个值,调用Lua,被请求的值 将会被压入栈。无论你何时想要传递一个值给Lua,首先 将这个值压入栈,然后调用Lua
Lua与C++交互:栈
• API用索引来访问栈中的元素。 • 在栈中的第一个元素(也就是第一个被压 入栈的)有索引1,下一个有索引2,以此 类推。也可以用栈顶作为参照来存取元素, 利用负索引。在这种情况下,-1指出栈顶元 素(也就是最后被压入的),-2指出它的前 一个元素,以此类推。 • 例如,调用lua_tostring(L, -1)以字符串的形 式返回栈顶的值。
Lisa = Account:new(); --创建Lisa这个Account实例 John = Account:new();--创建john这个Account实例 t1 = getmetatable(lisa); t2 = getmetatable(john); Lisa:withDraw(100) John:Deposit(200) Lisa,john相当于C++中的对象实例,Lisa 和 john 是Account类下的不 同的对象实例 Lisa,john其实还是Lua中的table,他们因为有共同的元表,所有可以看 成同一类的table Lisa:withDraw(100)的调用过程,从Lisa表中查找,找不到函数的声明, 因为又有元表,所有从元表中的中查找,在所指向的表中找到了 withDraw的声明,所有调用成功
Lua与C++交互的基本过程
• lua_State* L = lua_open();//创建Lua脚本虚拟机 • luaL openlibs(L);. //加载Lua运行库(内置的Lua函数) • //加载Lua文件到虚拟机 • luaL loadfile(L,”test.lua”); • lua_pcall( L, 0, LUA_MULTRET, 0 ); • 交互 • lua_close(L);
Lua与C的差异
• Lua是动态类型, 而C是静态类型的 • Lua使用垃圾收集,而C要求显示释放 需要一个中间的东西供两个不同的环境协 调工作
Lua与C++交互:栈
• • • • • 一个抽象的栈在Lua与C打交道 栈中的每一条记录都可以保存任何Lua值。 几乎所有的交互API函数都用到了栈 栈是由Lua来管理的 严格的LIFO规则来操作栈。当调用Lua时,它只会改变栈 顶部分。但通过Lua的API,可以查询栈上的任何元素, 甚至是在任何一个位置插入和删除元素。
• 可通过函数getmetatable查询任何值的元表。 • 可通过函数setmetatable替换表的元表。
面向对象的实例
• • • • • • • • • • • • • • • Account是账号类,它将是Lua中所有Account实例的元表 Account = {balance =0;} Function Account:WithDraw(v)—取款函数 self.balance = self.balance-v; End Function Account:new(o)—产生Account对象,一个实例 o = o or {} setmetatable(o,self)—设置元表 self.__index = self return o; End Function Account:despoit(v)—存款函数 self.balance += v; End
相关文档
最新文档