zoukankan      html  css  js  c++  java
  • Java中使用Lua脚本语言(转)

    Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的)。Lua在CC++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率、增强你的程序可扩展性。

    首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库。我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keplerproject.org/luajava/ 找到LuaJava的类库以及源代码,使用文档资等

    下载下来解压后包括两个文件(我下载的是1.1版本的): luajava-1.1.jar 文件和 luajava-1.1.dll动态连接库文件

    luajava-1.1.jar就容易了,就是将其加入你的项目的ClassPath中,以便程序可以使用它提供的API

    luaJava-1.1.dll就麻烦了,你必须将其加入你的Windows安装目录下,比如你用的是XP,安装在C盘,那就直接将其加入C:WINDOWS目录下即可,当然你也可以将其加入你的JDK下的jre下

    好了,现在你的项目就可以使用Lua脚本来实现动态扩展功能了!不过不要急,你还得有工具来写Lua脚本吧?不可能用记事本来写吧???????

    你可以使用UltraEdit,但你用UE打开lua文件后,会发现和记事本差不多,并没有高亮(可能新版本的支持Lua脚本了),如果你的UE不支持,那么先去UltraEdit的官网下载支持Lua的Wordfiles文件(http://www.ultraedit.com/files/wf/lua.txt),是个文本文件(lua.txt)。打开UltraEdit安装目录下的wordfile.txt,把lua.txt文件中的内容拷贝粘贴到wordfile.txt的末尾,存盘,OK,于是UltraEdit语法高亮项多出Lua一项,可以选择使用了。其他语言的语法高亮支持与此类似。

    但你如果是Java开发者,应该都用过Eclipse吧?可否在Eclipse下直接就写Lua脚本呢?答案是可以的!

    这当然是Eclipse的强大的插件管理功能啦,你可以去下载luaeclipse插件来使你的Eclipse拥有编写Lua脚本的能力(既可以高亮显示你的脚本,是不是很爽呢),你可以在这里下载:http://www.ideais.com.br/luaeclipse/

    下载后安装后,你的Eclipse就可以建立和编写Lua脚本了,注意设置一下首选项中关于LUA的属性(Eclipse安装插件就不用我说了吧????)

    好了,现在一切都准备好了,让我们来一个HelloWorld吧!

    首先在Eclipse先建立一个TestLua项目,然后编写如下程序:

    import org.keplerproject.luajava.*;

    public class Hello
    {
    public static void main(String[] args)
    {
    LuaState L = LuaStateFactory.newLuaState();
    L.openLibs();
    System.out.println("这里是Java程序调用Lua脚本");

    // 加载脚本hello.lua,并执行
    L.LdoFile("res/hello.lua");
    }
    }


    好了,程序写完了,当然是保存为Hello.java咯,注意,这是Java代码!这是Java代码调用了一个叫hello.lua的脚本,下边是这个脚本文件的内容(你可以直接把他们复制到你的hello.lua文件中):

    ================================================================

    --基本方法
    print("您现在使用的是LUA脚本语言")
    print("让我们一起来感受它的奇妙吧! ")

    --特点1,赋值
    a={1,2}
    b=a
    print(a==b, a~=b) --输出 true, false
    a={1,2}
    b={1,2}
    print(a==b, a~=b) --输出 false, true

    --特点2,交换
    a,b=1,2
    a,b=b,a
    print(a)
    print(b)

    print("连接".."字符串"..2^3)
    print(type(2))

    --while循环
    i=0
    print("while循环例子")
    while i<5
    do
    print(i);
    i=i+1
    end

    --repeat循环
    i=0
    print("repeat循环例子")
    repeat
    print(i)
    i=i+1
    until i>=5

    --for循环
    print("for循环例子")
    for i=0,5,1
    do
    print(i)
    end

    T1={}
    T1[1] = 10
    print(T1[1])

    function fun(a,b,...)
    print(a)
    print(b)
    print(arg[1])
    print(arg[2])
    print(arg[3])
    return
    end

    a,b=2,3
    fun(a,b,200,400,500)

    ========================================================

    好了,上边的脚本如果你不懂什么意思也没关系,直接运行一下吧

    你可以编译执行那个Hello.java程序就可以了,就会看到如下的输出结果:

    ========================================================

    这里是Java程序调用Lua脚本
    您现在使用的是LUA脚本语言
    让我们一起来感受它的奇妙吧!

    true false
    false true
    2
    1
    连接字符串8
    number
    while循环例子
    0
    1
    2
    3
    4
    repeat循环例子
    0
    1
    2
    3
    4
    for循环例子
    0
    1
    2
    3
    4
    5
    10
    2
    3
    200
    400
    500

    ==========================================================

    怎样,是不是很爽呢?觉得没意思?好,在来一段脚本吧:


    frame = luajava.newInstance("java.awt.Frame", "Lua Java Console")
    console = luajava.newInstance("java.awt.TextArea")
    buttons_pn = luajava.newInstance("java.awt.Panel")
    execute_bt = luajava.newInstance("java.awt.Button", "Execute")
    clear_bt = luajava.newInstance("java.awt.Button", "Clear")
    exit_bt = luajava.newInstance("java.awt.Button", "Exit")

    frame:setSize(600,300)

    buttons_pn:add(execute_bt)
    buttons_pn:add(clear_bt)
    buttons_pn:add(exit_bt)

    BorderLayout = luajava.bindClass("java.awt.BorderLayout")

    frame:add(BorderLayout.NORTH, console)
    frame:add(BorderLayout.SOUTH, buttons_pn)
    frame:pack()
    frame:show()

    --
    -- Listeners
    --

    execute_cb = {
    actionPerformed = function(ev)
    print("execute")
    pcall(loadstring(console:getText()))
    end
    }

    jproxy = luajava.createProxy("java.awt.event.ActionListener",execute_cb)

    execute_bt:addActionListener(jproxy)


    clear_cb = {actionPerformed= function (ev)
    print("clear");
    console:setText("");
    end
    }

    jproxy = luajava.createProxy("java.awt.event.ActionListener" ,clear_cb)
    clear_bt:addActionListener(jproxy)

    exit_cb = { actionPerformed=function (ev)
    print("exit")
    frame:setVisible(false)
    frame:dispose()
    end
    }


    jproxyb = luajava.createProxy("java.awt.event.ActionListener" ,exit_cb)

    exit_bt:addActionListener(jproxyb)

    close_cb = { }
    function close_cb.windowClosing(ev)
    print("close")
    frame:setVisible(false)
    frame:dispose()
    end

    function close_cb.windowActivated(ev)
    print("act")
    end

    jproxy = luajava.createProxy("java.awt.event.WindowListener", close_cb)
    frame:addWindowListener(jproxy)

    来自:http://hi.baidu.com/panzhong/blog/item/e991b30a81d5da3fb1351d7b.html

    http://www.cnblogs.com/thingsoft/archive/2011/04/09/2010227.html

  • 相关阅读:
    MySQL事务_transaction
    mysql
    反射跳过泛型检查
    spring java.io.FileNotFoundException cannot be opened because it does not exist
    Servlet中ServletConfig的作用
    Exception in thread "main" java.lang.ClassCastException: java.base/java.util.HashMap$Values cannot be cast to java.base/java.util.ArrayList
    java中字符串和其他数据类型之间使用“+”号连接
    comboBox加载数据
    自动填充
    3号随笔,搭建web环境
  • 原文地址:https://www.cnblogs.com/softidea/p/5240353.html
Copyright © 2011-2022 走看看