当前位置:嗨网首页>书籍在线阅读

05-Lua语言

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.2 Lua语言

Lua是一个高效的轻量级脚本语言。Lua在葡萄牙语中是“月亮”的意思,它的徽标形似卫星(见图6-1),寓意着Lua是一个“卫星语言”,能够方便地嵌入到其他语言中使用。

40.png

图6-1 Lua的徽标

为什么要在其他语言中嵌入Lua脚本呢?举一个例子,假设你要开发一个运行在iPhone上的电子宠物游戏,你可能希望设定玩家每次给宠物喂食,宠物的饥饿值就会减N点。如果N是一个定值,那么就可以将N硬编码到代码中。一切都很好,直到某天你发现有大量的玩家抱怨说自己的宠物简直太能吃了,每天需要喂几十次才能喂饱。这时你不得不发布一个新版本来提高N的值,并让玩家到App Store中升级整个游戏(这期间还有漫长的应用审核过程)。不过这次你有经验了:你将N的值存到了网上,每次游戏启动后都联网查询最新的N值。这样如果下次发现N不合适,只需要在网上修改一次,所有的玩家就能自动更新了。又平安无事地过了几天,你却发现即使可以随时调整N的值,但还是无法让玩家满意,诸如“为什么我的宠物一分钟内可以吃完一周的饭量?”这样的抱怨越来越多。你知道这次必须修改代码来限制短时间内不能连续喂食多次了,同样你又要经历从发布到审核的等待,而所有的玩家又得到App Store中为了这一段代码重新更新整个游戏。好在你终于意识到应该使用一个更好的方法——嵌入Lua脚本来实现这一更改了。现在你将喂食的逻辑写在Lua脚本中,例如:

function feed(timeSinceLastFeed)
  local hungerValue = 0
  if timeSinceLastFeed > 3600
    hungerValue = ((timeSinceLastFeed - 3600) / timeSinceLastFeed) * 200
  return hungerValue
end

然后在你的程序中嵌入一个Lua解释器,每次需要喂食时就通过解释器调用这个Lua脚本,并将上次喂食距现在的时间传给 feed 函数, feed 函数根据这个时间计算此次喂食需要减少的饥饿值:时间越短减少的饥饿值就越少。下次需要调整这个算法时只要从网上更新这个脚本就可以了,连游戏都不用重启。另外你还可以把宠物的状态如心情之类的传入这个函数,即使现在用不到,以后说不定也会用到。总之越多的逻辑放在脚本上,你的程序升级或扩展就越容易。

实际上很多iOS游戏中都使用了Lua语言,例如2011年很火的游戏《愤怒的小鸟》就是使用Lua语言实现的关卡,而就在那一年Lua在TIOBE世界编程语言排行榜上进入了前10名。另外风靡全球的网络游戏《魔兽世界》的插件也是使用Lua语言开发的。

其实Redis和电子宠物游戏遇到的问题有点相似,很多人都希望在Redis中加入各种各样的命令,这些命令中有的确实很实用,但却可以使用多个Redis已有的命令实现。在Redis中包含所有开发者需要的命令显然是不可能的,所以Redis在2.6版中提供了Lua脚本功能来让开发者自己扩展Redis。