WPF/Silverlight深度解决方案:(十)与嵌入式脚本语言Lua & Javascript的交互(上)
嵌入式脚本语言能赋予我们系统程序更加强大的灵活性与拓展性,以魔兽级的Lua为例,不过200多K的体积却拥有极快的运算速度。在.NET开发应用中,它可以被广泛的应用到允许Unsafe Code诸如:WinForm、WebForm、WPF等领域,其表现出来的易用性(无须考虑核心模块复杂的逻辑,只需要用最简单的脚本去完成指定任务即可)、跨平台性(一次编译通过的正确脚本可以随意移植到其他语言系统中)、需求拓展性(在对系统功能的补充与升级中同样发挥着举足轻重的作用)等使得它遍布于各种开发领域。
本节,我将向大家讲解如何实现WPF与Lua的交互。
首先,我们需要在WPF项目中添加对Lua的引用,大家可以到http://code.google.com/p/luainterface/下载Lua最新的.NET接口。下载下来的压缩包中包含两个dll,分别是:lua51.dll和LuaInterface.dll,其中lua51.dll是由VC编写封装的,不开源;LuaInterface.dll由C#编写,如果您感兴趣想研究它,可以通过SVN下载其源码:http://luainterface.googlecode.com/svn/trunk/ :
接下来,我以一个游戏中的聊天谈话场景为例,首先当然是创建Lua脚本文件(名为Talk.lua),该脚本负责存储聊天内容,同时还要根据传来的参数经处理后回调给cs后台代码,并最终反映给UI界面。其中最主要的代码段如下:
content = {
[1]="听说你老婆生了波|啊?真的?|真的假的哇?|你们听说没,深蓝色右手最近和施瓦辛格准备合拍下一部作品,好像要取名叫:'断肩山'|……";
[2]="握着老婆的手,好象左手握右手;握着小姐的手,好象回到十八九;握着女同学的手,后悔当初没下手|……";
[3]="前清时期坐过堂|北洋军中扛过枪|武昌城里落过荒|北伐战争帮过忙|......";
}
function ShowTalk(i)
_,count=string.gsub(content[i], "|", "|");
RandomTalk(Split(content[i],"|")[math.random(count+1)]);
end
第一个全部变量content为存储不同谈话内容的table,我为它定义了3组内容。最后通过ShowTalk方法中调用cs后台代码中的RandomTalk方法来实现将谈话内容显示到画面上。RandomTalk方法并不属于Lua脚本文件的一部分,而是我们项目后台代码中的一个方法,这里即展示了Lua调用WPF的方法。当然,我们还需要在WPF后台的cs中为该脚本注册此方法才能最终发挥作用:
Lua lua = new Lua();
lua.RegisterFunction("RandomTalk", this, this.GetType().GetMethod("RandomTalk"));
lua.DoFile("Talk.lua");
是不是很简单?仅仅3行代码即完成了Lua的创建与方法注册。那么反过来,我们要如何实现在WPF中调用Lua脚本方法呢?同样仅仅一行代码搞定:
lua.GetFunction("ShowTalk").Call(Convert.ToInt32((comboBox1.SelectedItem as ComboBoxItem).Tag));
通过GetFunction方法来运行Lua脚本的ShowTalk方法,其中Call括号中的值为要传递的参数,该方法返回的是一个Object[]对象,即如果脚本中的ShowTalk方法带Return值,那么可以将之获取。是不是很强大?Lua类中还有其他非常多的方法,能够满足各种交互需求,如果大家感兴趣可以自行到网上查询相关使用方法。
最后发一张场景测试截图吧(源码可以到目录中下载):
Lua的优点实在太多,要不人家魔兽怎么会选择它作为御用脚本语言呢?但是由于Silverlight的安全性问题,Lua无法嵌入到Silverlight平台上,该死的难道就没折了吗?您是否忽略了Web上的脚本王者Javascript,熟悉两者的朋友会发现JavaScript 和 Lua 拥有着惊人相似。那么下一节我将向大家讲解如何使用Javascript在Silverlight中实现本节同样的效果,敬请关注。