1. 程式人生 > >Java中使用Lua指令碼語言

Java中使用Lua指令碼語言

Lua是一個實用的指令碼語言,相對於Python來說,比較小巧,但它功能並不遜色,特別是在遊戲開發中非常實用(WoW採用的就是Lua作為指令碼的)。Lua在C\C++的實現我就不多說了,網上隨便一搜,到處都是這方面的介紹,我想說的是如何在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("讓我們一起來感受它的奇妙吧!\n")

--特點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])

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

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

怎樣,是不是很爽呢?覺得沒意思?好,在來一段指令碼吧:

= luajava.newInstance("java.awt.", "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")

:setSize(600,300)

buttons_pn:add(execute_bt)

buttons_pn:add(clear_bt)

buttons_pn:add(exit_bt)

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

:add(BorderLayout.NORTH, console)

:add(BorderLayout.SOUTH, buttons_pn)

:pack()

:show()

--

-- Listeners

--

execute_cb = {

actionPerformed = (ev)

    print("execute")

    pcall(loadstring(console:getText()))

end

}

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

execute_bt:addActionListener(jproxy)

clear_cb = {actionPerformed= (ev)

    print("clear");

    console:setText("");

end

}

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

clear_bt:addActionListener(jproxy)

exit_cb = { actionPerformed= (ev)

print("exit")

    :setVisible(false)

    :dispose()

end

}

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

exit_bt:addActionListener(jproxyb)

close_cb = {    }

close_cb.windowClosing(ev)

    print("close")

    :setVisible(false)

    :dispose()

end

close_cb.windowActivated(ev)

    print("act")

end

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

:addWindowListener(jproxy)