javalua腳本
1. c,c++,java,lua那種語言易學
說實話,都不好學!C語言在處理很多問題是很麻煩,而c++中指針也是一個容易出問題的關鍵,好不好學在羽你自己的理解和運用的能力,不過推薦你學C++,畢竟它是後起之秀,而且現在c++語言也在逐步淘汰中~~,其實你也可以考慮JAVA,相對容易點 追問: lua呢 就是寫腳本的 回答: lua的設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。Lua最著名的應用是在暴雪公司的網路游戲WOW中 ,Lua由標准C編寫而成,代碼簡潔優美,幾乎在所有操作系統和平台上都可以編譯,運行。 一個完整的Lua解釋器不過200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式腳本的最佳選擇。LUA語言的官方版本只包括一個精簡的核心和最基本的庫。這使得LUA體積小、啟動速度快,從而適合嵌入在別的程序里。LUA可以很容易地被擴展:由宿主語言(通常是C或C++)提供其大部分功能,總的一句話,程序語言都是相通的一門學好了,其他的就容易多啦!好友如果你是學專業的話 c++ 絕對不會錯,而且其他都必須有所懂,業余的話就夠了,lua是在他們的基礎上發展的,想往游戲之類的發展的話先了解一下前二者再來學它!!
2. 在java中調用lua執很多次之後,內存使用率持續上升,無法釋放
要看LuaState luaState = LuaStateFactory.newLuaState();
和 luaState.close();的實現方式。
lua中有調用內存分配用戶對象,但沒注冊gc的話,luastate的close不會釋放內存。
3. 如何在Java中使用Lua腳本語言
如何在Java中使用Lua腳本語言是本文要介紹的內容,主要是來學習LUA腳本語言在JAVA中如何來使用,Lua就不說了, 現在比較熱門, 語法也很簡單. 為了在Java中調用, 折騰了比較長的時間, 就把一些東西記在下面.來看詳細內容講解。
Lua是支持內嵌在C程序中的, 但是官方不支持Java. 在網上查了下, 有LuaJava開源庫, 拿來試用了一下, 發現這個庫還算比較完善的.
這個LuaJava實際上就是按照Lua官方文檔, 把Lua的C介面通過JNI包裝成Java的庫. 下載, 裡面是一個.dll, 一個.jar. 把.dll放到java.library.path下, 再把.lib放到classpath中, helloworld運行OK.
但是, 測試的時候, 很快發現了第一個問題: 在調用LuaJava中提供的LuaState.pushInteger 方法的時候, 出現了錯誤 : Unsatisfied Link Error. 其他的LuaState.pushNumber方法倒是沒有問題. 用Depends工具看了下, 這個.dll居然沒有導出pushInteger這個函數. 暈....
下載LuaJava的源代碼, 查看了下Luajava.c 和 Luajava.h, 發現果然裡面有點問題, 在.h裡面定義了JNI中對應Java函數的C函數
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
但是.c中沒有實現這個函數. 無語, 看來大馬虎哪都有啊. 幸虧有源代碼, 照貓畫虎在Luajava.c中加上這個函數的實現,
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger (JNIEnv * env, jobject jobj, jobject cptr, jint i) { lua_State * L = getStateFromCPtr( env , cptr ); lua_pushinteger(L, i); }
然後編譯. 編譯也出現了問題了, 官方文檔中說可以用VC++來Build, 但是沒有說官方用的是什麼版本. 我用VC2005就不行. 好在Luajava比較小, 就一個.h 一個 .c , 在VC中新建一個.dll項目, 把文件加進去, 修改一下build參數 (Include 需要加上lua的頭文件, lib中需要加上lua的.lib文件, 另外要選上 Compile as C Code (/TC) ) Build, 通過了.
這時再在Java中調用pushInteger方法就沒有問題了.
在測試中, 發現Luajava提供的文檔中, 對於Lua腳本怎麼調用Java對象/方法很詳細, 但是在Java中怎麼調用Lua函數/取得返回值 就沒有. 參考了http://www.lua.org/manual/5.1/manual.html#lua_CFunction 的Lua C文檔, 實現了傳遞對象到Lua中並取得返回值的代碼:
Test1: 測試傳遞簡單類型, 並取得返回值:
Lua 腳本(test.lua):
function test(a,b) return a+b end
Java代碼:
static { //載入Lua5.1.dll, 因為LuaJava最後還是要調用Lua的東西 System.loadLibrary("lua5.1"); } public static void main(String[] argu) throws LuaException { LuaState L = LuaStateFactory.newLuaState(); L.openLibs(); //讀入Lua腳本 int error = L.LdoFile("test.lua"); if (error != 0) { System.out.println("Read/Parse lua file error. Exit."); return; } //找到函數test L.getField(LuaState.LUA_GLOBALSINDEX, "test"); //參數1壓棧 L.pushInteger(1); //參數2壓棧 L.pushInteger(2); //調用!! 一共兩個參數, 1個返回值 L.call(2, 1); //保存返回值, 到a中 L.setField(LuaState.LUA_GLOBALSINDEX, "a"); //讀入a LuaObject l = L.getLuaObject("a"); //列印結果. System.out.println("Result is " + l.getString()); L.close(); }
測試2: 傳遞Java對象
class Value { public int i; public void inc() { i++; } public int get() { return i; } public String toString() { return "Value is " + i; } }
Lua腳本: (該腳本中調用兩次對象的inc方法, 並調用get方法輸出結果)
function test1(v) v:inc(); v:inc(); print("In lua: " .. v:get()); return v end
Java 代碼: (前面都一樣, 略)
//找到函數test1 L.getField(LuaState.LUA_GLOBALSINDEX, "test1"); //生成新的對象供測試 Value v = new Value(); //對象壓棧 L.pushObjectValue(v); //調用函數test1, 此時1個參數, 1個返回值 L.call(1, 1); //結果放在b中. L.setField(LuaState.LUA_GLOBALSINDEX, "b"); LuaObject l = L.getLuaObject("b"); System.out.println("Result is " + l.getObject());
運行結果:
Result is Value is 2 In lua: 2
和預期的一致.
實現一個怪物的創建,把lua里的設定當作初始狀態傳給monstor,名字為sample monstor,防禦10,攻擊10,生命100
1.先導入lib--luajava-1.1.jar
import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFactory; public class Load{ LuaState luaState; /** * Constructor * @param fileName File name with Lua . */ Load(final String fileName) { this.luaState = LuaStateFactory.newLuaState(); this.luaState.openLibs(); this.luaState.LdoFile(fileName); } /** * Ends the use of Lua environment. */ void close() { this.luaState.close(); } /** * Call a Lua inside the Lua to insert * data into a Java object passed as parameter * @param Name Name of Lua . * @param obj A Java object. */ void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1,0); } } public class Monster{ /* Info */ protected String race; protected int defense; protected int attack; protected int life; /* */ private Load ; public Monster(String race) { /* Loads Lua for this race.*/ this. = new Load(race+".lua"); /*Call Lua create .*/ .run("create", this); } public void setRace(String race) { this.race = race; } public String getRace() { return race; } public int getDefense() { return this.defense; } public void setDefense(int defense) { this.defense = defense; } public int getLife() { return this.life; } public void setLife(int life) { this.life = life; } public void setAttack(int attack) { this.attack = attack; } public int getAttack() { return this.attack; } } monstor.lua--- create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) end
但總是拋出這個錯誤:
PANIC: unprotected error in call to Lua API (Invalid method call. No such method.)
不知為何,以後用到的時候再research.
已經查出來,原來在Monster類中少了個方法:
public void setRace(String race) { this.race = race; }
怪不得會找不到,
要在一lua文件a.lua里導入其他的lua文件b.lua,用require "b"
如果要從lua中運算後得到返回參數,則需要做一下修改:在lua文件中改成:
create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) return monster end
在Load.java中的run改成如下:
void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1, 1);// 一個參數,0個返回 try { Object object =luaState.getObjectFromUserdata(1); } catch (LuaException e) { e.printStackTrace(); } }
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
4. 游戲開發中常用哪種腳本語言
隨著《魔獸世界》(以下簡稱wow)在世界范圍內流行,腳本漸漸被人們所熟知。由於wow強大的自定義界面系統,Lua這一腳本語言一舉成名。
其實早在Lua腳本語言被大眾所熟知以前,游戲業內人士就已經開始使用腳本來開發游戲了。我們熟悉的很多國內的網路游戲大都運用了腳本開發,比如網游的長青樹「夢幻西遊和《大話西遊2就大量應用了腳本技術。特別是《大話西遊2》,其實現基於Lua腳本游戲開發的時間要遠早於《魔獸世界》。在腳本技術上,國內與國外其實是站在同一起跑線上的,並不存在什麼差距,這也為國內游戲產業趕超國外游戲產業提供了強有力的技術保證。
在單機游戲時代,腳本這個詞幾乎很少出現,那麼,為什麼在網路游戲時代它卻成了業界的寵兒呢?原因是多方面的。
單機游戲時代,無論游戲主機還是PC機,它們的性能都非常低下,從而需要具有較高執行效率的編譯型語言對機器的性能進行「壓榨」。隨著科技發展和硬體性能的不斷提升,腳本逐漸被開發者所接受並利用,但這並不是腳本流行起來的決定性因素,真正的原因還在於游戲市場有這方面的需求。
網路游戲時代的市場競爭激烈、變化莫測,如果延用單機時代一年半載才出一個新版本的開發方式,必然會被游戲行業激烈的市場競爭所淘汰。正是這種游戲市場需求旺盛和開發工具效率底下之間的矛盾,促使腳本語言迅速地發展起來。腳本的興起使得傳統編譯型語言(asngC/C )的性能優勢在硬體功效大幅攀升的今天已經不復存在。
除了市場和硬體這兩個因素之外,還有一點我們不能忽略。那就是用C/C 進行游戲開發的高成本和高項目風險。隨著java/.net逐漸流行,學習C/C 編程語言的人越來越少,而網路游戲市場的需求卻越來越龐大,在程序人才大量匱乏的情況下,造成了c,C 人才的高成本。即便是有能力僱傭大量C/C 程序員的公司,在開發游戲的過程中,也不能無視C/C 的高級特性和高度靈活性帶來的高項目風險。C/C 是易學難精的編程語言,在開發大型項目的時候由於程序員的水平參差不齊,所以極易造成溝通不暢。不僅如此,c,C 濫用的高級特性也容易引入大量bug。正是由於這些原因,游戲公司開始在游戲中使用腳本,希望通過腳本來解決這些高成本、高風險的問題。
二.腳本的現狀
腳本不僅解決了c/C 無法解決的開發效率難題,還降低了開發的成本和風險。因此腳本技術在游戲業內蓬勃發展起來,並且已經成為游戲業中不可或缺的一環。縱觀當前腳本技術現狀,形勢一片大好,不僅語言百家爭鳴,而且書籍種類也越來越多;不僅在游戲業界開花結果,在web等其它應用領域也大放異彩。
首先,我們來看看目前比較流行的腳本:Python、Lua、ruby和Erlang。Python和Lua是網路游戲開發的中堅力量;ruby憑借 rubyonrails的web開發框架的強勁力量,其在游戲業的發展前途亦不可小視;Erlang在高並發性上的原生優勢吸引了無數追求高性能網游伺服器的開發人員的目光。
其次,我們來看看書籍方面。大家都知道,文字對語言的普及起到了催化劑的作用,甚至可以看作是語言的有機組成部分。Python經過基金會的多年經營而得到NASA、Google重用的原因,就是由於其相關書籍種類比較豐富;Ruby隨著RoR的流行,這兩年行情看好,書籍也出版得越來越多了;Erlang是典型的少眾語言,但隨著多核時代的來臨和高並發網路應用的需求,Erlang有著光明的發展前景,現在<<ProgrammingErlang>>等書也已經在策劃出版了;反觀Lua,雖然目前越來越流行,但由於它晦澀的介面設計和缺乏大型應用的支持,使得相關書籍寥寥無幾。
最後,我們把焦點重新聚集到游戲開發行業中,其實不難發現,除了前文提到的《魔獸世界》和網易經典「西遊系列」使用了腳本外,現在大多數比較流行的程序也都使用了腳本,如騰訊的QQgame))和搜狐的《天龍八部》等。不僅如此,現今的游戲引擎也都提供了腳本介面,無論是商業的unreal引擎還是開源的 OGRE,無一例外。
三.腳本的優勢
腳本之所以能夠在游戲業中找到自己的一席之地,是因為網路游戲市場需要一個快速開發方案來避免C/C 開發帶來的項目高成本和高風險。那麼,腳本相對於C/C 這類編譯型語言到底有什麼優勢呢?
I易於學習,代碼可維護性強
腳本的語法通常都非常簡單,也沒有太多高階的特性,學習的門檻較C/C 低得多,比如Python可能只需要花一個下午即可學會。這使得游戲開發公司可以招聘完全沒有腳本、編程經驗的新手,通過低成本的培訓,他們便能迅速地走上工作崗位。除易於學習外,腳本代碼也有較強的可維護陛(盡管寫出沒有人看得懂的Lua代碼也非難事)。因為腳本沒有很多高階特性(如c 里的模板元編程就是高階特性),所以腳本程序員就有更多的精力去架構、模式、重用和測試等工作,從而提高了代碼的可維護性。相應地,正因為沒有那麼多讓人困惑的高階特性,也使得腳本代碼「簡潔」不少。
2.降低開發成本
如上所言,由於腳本易於學習,游戲開發公司可以大量起用新手,這正是降低成本的有效手段。那麼如何來確保新手所寫代碼的質量呢?眾所周知,新手無論用什麼語言寫程序肯定會出現bug,但用C/C 和Python做比較,可以看出,一個新手用C/c 編寫出的程序所出現的bug肯定會比用Python編寫出現的bug要多。由於c程序需要編譯,而腳本程序(大部分)都可以直接解釋執行,所以在排除 bug方面腳本也佔有一定的優勢,這也使腳本在降低成本的同時能夠更好地保證代碼質量。
3.形成人才壁壘
軟體開發行業是一個頗為動盪的行業,無數的程序員都在跳槽和謀劃跳槽的狀態中生活,使用腳本開發形成人才壁壘是游戲業減少人才流動的有效手段。因為現在腳本除了在游戲業中非常流行外,並沒有在其它行業形成廣泛應用(雖然在web開發方面也有燎原之勢,但終究不如在游戲業中的地位高)。這就使得游戲程序員很少會考慮非游戲行業的職位,但其它行業的程序員卻可能會因為腳本的易學習性而轉投游戲業。腳本除了能有效形成行業間的人才壁壘外,也能有效地形成企業間的人才壁壘。由於現有的腳本種類繁多,不同公司往往有不同的選擇,甚至有些公司使用自己開發的腳本語言,所以程序員從公司A跳槽到公司B可能要學習使用另一種腳本,這就提高了跳槽的成本,從而減少了人才的流動。
四.腳本的發展趨勢
依照目前趨勢來看,腳本語言一定會更加的普及,而且會逐漸滲透到其它行業中。隨著網路游戲從業人員數量的增長,腳本程序員也一直增加,而且Web2、0熱潮引起的網路需求,也促成了一批批新腳本程序員的誕生。網路游戲市場就像一個正在滾動的雪球,推動著腳本的普及。
隨著腳本在游戲業中越來越流行,市場對生產效率的需要也會相應提高。腳本雖然在一定程度上緩解了生產效率與生產工具之間的矛盾,但仍然不夠完善。由於市場競爭日趨激烈,而網路游戲在很多功能上的實現又都相差無幾,如網路、資料庫、圖形甚至部分邏輯,這必然會引起網路游戲生產的組裝化一一大量中間件相互組合形成新的網路游戲。從目前來看,Bigwofld、PhysX和Unreal等都是比較流行的網路游戲中間件。腳本語言則是粘合各個中間件的良好膠水語言,所以隨著網路游戲的生產組裝化,腳本將有更大的發展空間。
那麼,當腳本發展到如日中天的時候,可能取代C/C 這些編譯型語言嗎?筆者認為不會。腳本語言和編譯型語言在生產效率和執行效率上各擅勝場,網路游戲既需要能快速應變的腳本,也需要能快速執行以提供更絢麗游戲效果的編譯型語言。未來,它們之間一定會保持長久的和諧互補關系,相輔相成。
五.結語
綜上所述,網路游戲時代是上帝賜予腳本語言發展的絕好時機,腳本語言很快將迎來光芒四射的時代。腳本語言擁有編譯型語言無可比擬的生產效率優勢,所以它們將互補互助並肩奮戰在游戲的最前線。
5. 請教如何用.lua調用.java包內的方法和變數
1.lua加入到環境變數中。即cmd可以識別lua命令
(右鍵計算機-》高級系統設置 在高級面板 -》環境變數 在系統變數或者用戶變數中找到path(沒有就新建path) path 中加入lua的路徑即可,如:D:\Developments\Lua\5.1(原來有path時,在原來的path值後加分號,再加路徑,如:原來的值;D:\Developments\Lua\5.1))
2.寫一個lua的腳本,放在任意路徑下。比如在桌面下有文件 hello.lua文件內容為
print('Hello World!')
3進入cmd(win+R 輸入cmd回車) 切到桌面
cd C:\Documents\Desktop\
運行腳本即可:lua hello.lua
輸出結果為:Hello World!
6. 除了flash編程語言之外,有沒有其他的編程語言能來製作動作腳本
有很多語言腳本,java非常有名,手機上用的apk文件好像就是java語言。
分別為:
解釋型(PHP,Perl,Python,Ruby,Tcl,Lua,JavaScript,Io)
操作系統自動化型(POSIX Shell,AppleScript,PowerShell)
C++風格(C++,Objective C,Java,C#)
Pascal風格(Pascal,Ada,PostgreSQL,MySQL)
(6)javalua腳本擴展閱讀:
腳本語言是為了縮短傳統的編寫-編譯-鏈接-運行(edit-compile-link-run)過程而創建的計算機編程語言。它的命名起源於一個腳本「screenplay」,每次運行都會使對話框逐字重復。早期的腳本語言經常被稱為批量處理語言或工作控制語言。
一個腳本通常是解釋執行而非編譯。腳本語言通常都有簡單、易學、易用的特性,目的就是希望能讓程序員快速完成程序的編寫工作。而宏語言則可視為腳本語言的分支,兩者也有實質上的相同之處。
腳本語言(JavaScript,VBscript等)介於HTML和C,C++,Java,C#等編程語言之間。HTML通常用於格式化和鏈接文本。而編程語言通常用於向機器發出一系列復雜的指令。
7. java代碼,執行lua腳本!
要在Java上使用Lua腳本,必須有關於Lua腳本解釋器以及Java程序可以訪問這些腳本的相關API,即相關類庫。可以使用一個叫做LuaJava的開源項目,可以在www.keplerproject.org/luajava/ 找到LuaJava的類庫以及源代碼,使用文檔資等
8. 求各位幫我簡單解釋一下JAVA語言和LUA語言。 我想開發一款2D俯視視角游戲。 解釋一下電腦配置
java語言主要用來編寫游戲界面或者伺服器後台,不過效率沒有c高。lua是腳本語言主要用來部署游戲場景,初始化游戲配置等,效率較高。游戲流暢度和你的演算法優化有關系,一般現在做游戲都用游戲引擎的,畢竟速度較快。
至於圖片格式無所謂,盡量讓圖片小一點,可以減少你安裝包的體積。
希望能幫到樓主,給個採納吧,有不懂你可以追問