• 甘肃福彩网官网

  • 甘肃福彩网官网

  • 甘肃福彩网官网

  • 甘肃福彩网官网

甘肃福彩网官网

作者︰馬三小(xiao)伙兒  發布日期(qi)︰2020-02-20 07:25:04
Tag標簽︰小(xiao)白  
  •   在很多游(you)戲中,腳本語言yun)遣bu)可或缺的一(yi)部分,很多游(you)戲都(du)使用(yong)到了Lua,js,python一(yi)類的腳本,腳本語言可以在很多方面給開發進程帶來幫助(zhu)。腳本語言可以作為初始化(hua)文件讀入變量(liang)和(he)游(you)戲數據的一(yi)個快速而方便的方法。它們通常因為具有節省編譯(yi)時間(jian)提高生產效率(lv)、提高創造性和(he)拓展性的有點而受到眾多游(you)戲開發廠商的青(qing)睞。在本篇博(bo)客中,馬三將和(he)大家一(yi)起學習一(yi)下Lua這門腳本語言。

      一(yi)、搭建Lua運行環(huan)境

      學習任何一(yi)門編程語言恐怕都(du)是要先(xian)搭建起來它的mu)  huan)境,這樣才能多寫代碼多練習。Lua有一(yi)個交huan)?慕饈統(tong)絛xu)(lua.exe),你可以用(yong)它來驗證(zheng)一(yi)些小(xiao)的代碼片段,但是對于比較長(chang)和(he)tou)叢擁拇耄 詈檬鞘褂yong)C/C++的Lua API來運行,下面的代碼就是從C/C++程序(xu)中運行一(yi)個Lua腳本所需的代碼塊︰

    extern 'C'{ #include <Lua.h> #include <lualib.h> #include <lauxlib.h>}

      第一(yi)步要做(zuo)的就是包(bao)含相(xiang)關(guan)的頭文件,因為Lua是一(yi)個純(chun)C的mu)猓 員匭胂允(yun)降厝帽嘁yi)器(qi)知道這一(yi)點,不(bu)然就會遇到問題。通過將#include 和(he) extern 'C'一(yi)起使用(yong)就可以解決了。

    //包(bao)含lua庫。如果(guo)你的編譯(yi)器(qi)不(bu)支持這個指令(ling)的話(hua),那麼別忘了在你的項(xiang)目(mu)設置中加入這些庫#pragma comment(lib,'lua.lib')#pragma comment(lib,'lualib.lib)#include <iostream>int main(){ //創建一(yi)個lua state lua_State *pL=lua_open();}

      每一(yi)個運行的腳本文件都(du)在一(yi)個動態(tai)分配的叫做(zuo)lua_State的數據結構中運行xiao)ua庫中的每一(yi)個函(han)數的調(diao)用(yong)都(du)需要把lua_State的指針作為一(yi)個參數傳(chuan)遞給那個函(han)數,因此在運行一(yi)個Lua腳本文件之(zhi)前,必須通過lua_open來創建一(yi)個Lua State。

    //開啟lua中的標準庫lua_open_base(pL);luaopen_string(pL);luaopen_table(pL);luaopen_math(pL);luaopen_io(pL);

      Lua中有幾個標準庫,它們提供了輸入輸出、算(suan)術計算(suan)、字符串操作等一(yi)系(xi)列的功能函(han)數。上面的幾行代碼可以讓你在腳本里調(diao)用(yong)這些庫命令(ling),就像C++#include響應的mu)庖yi)樣。

      

    if(int error=lua_dofile(pL,'lua_script.lua') !=0 ){ std::cout<<'error!'<<endl; return -1;}

      使用(yong)lua_dofile命令(ling)可以裝入、編譯(yi)、運行Lua腳本。如果(guo)運行的時候報錯了,那麼它會返回一(yi)個錯誤(wu)的代碼。

      

      二、Lua的變量(liang)、類型、操作符和(he)條件結構

      搭建好環(huan)境終于可以寫些Lua代碼練練手了。但是在這之(zhi)前我們還是先(xian)來熟悉一(yi)下Lua的變量(liang)、類型、操作符和(he)條件結構(如果(guo)你之(zhi)前有任何一(yi)門編程語言的基(ji)礎,那麼這些內容(rong)學起來將會十分輕(qing)松)。

      1.Lua變量(liang)

      Lua是一(yi)門動態(tai)語言,它和(he)C++/Java不(bu)同(tong),變量(liang)是可以被賦予任何類型的值(這點和(he)js,python等腳本一(yi)樣),比如︰

      

    --lua腳本開始啦!name='masanxiaohuoer'print('Name='..name);pi=3.1415926name=pipi=false

      在Lua中,注(zhu)釋通常是以“--”開始的,如果(guo)要寫多行的注(zhu)釋,可以這樣的結構︰--[[這是一(yi)段注(zhu)釋內容(rong)]]。在lua中,每句(ju)代碼後(hou)面的分號可寫chun)剎bu)寫,但是當你的代碼跨行的時候分號是必不(bu)可少的。同(tong)時在lua中可以同(tong)時給多個變量(liang)賦予多個值。

      

    a,b,c,d = 1,2,3,4

      如果(guo)左側的變量(liang)個數比右ye)嗟畝嗟幕hua),那麼多余(yu)出來的變量(liang)就會被賦予nil值,nil在lua中表示沒有意義,空(kong)值(類似于C++中的NULL)。如果(guo)右ye)嗟鬧刀嗟幕hua),那麼多余(yu)的值就會被丟棄掉了。在Lua中,有3中不(bu)同(tong)的變量(liang)︰global(全(quan)局)、local(局部)、table fields(表)。如果(guo)一(yi)個變量(liang)沒有用(yong)local修飾的話(hua),那麼它默認(ren)就是global的。在一(yi)個變量(liang)被賦值之(zhi)前,它的值是nil。

      2.Lua類型

      Lua中有以下的8種基(ji)本數據類型︰

      (1)Nil空(kong)

        nil和(he)其他的類型都(du)不(bu)同(tong),她用(yong)來表示沒有意義,空(kong)值。一(yi)旦給一(yi)個值賦予了nil,它就消(xiao)失了,好像從來沒有存在過一(yi)樣。

      (2)Number數值

        number類型用(yong)來表示浮點數。在lua內部,這個值被處理(li)為double。因此,當傳(chuan)遞number類型的變量(liang)給C/C++程序(xu)的時候,要記得將它們映(ying)射(she)成對應的正(zheng)確類型。  

      (3)String字符串

        string類型是字符串類型,你可以yun)褂yong)“..”來鏈接(jie)兩個字符串。如果(guo)有一(yi)邊的類型不(bu)是string的話(hua),那麼它會被轉型為string類型,然後(hou)連(lian)接(jie)。

      (4)Boolean布爾

        用(yong)來表示true或者false的值類型,0或者nil都(du)是false,其余(yu)的為真。

      (5)Function函(han)數

        和(he)C/C++不(bu)同(tong),在Lua中,函(han)數也(ye)是一(yi)種類型,也(ye)可以賦值給一(yi)個變量(liang)。因此通過使用(yong)那個變量(liang)的名字,你就可以調(diao)用(yong)那個函(han)數。因為Lua是弱類型的語言,參數列表和(he)返回值都(du)不(bu)需要指定(ding)類型。下面是一(yi)個簡單的例子,求兩個數之(zhi)和(he)。在Lua中,函(han)數塊通過end關(guan)鍵字來結束。

      

    add=function(a,b)return a+bend

      如果(guo)你習慣用(yong)的是java或者C++一(yi)類的語言的話(hua),可能會對這個語法感覺有點陌生。Lua提供了另外(wai)一(yi)個定(ding)義一(yi)個函(han)數的方式,這樣看起來更像C++/java了︰

      

    function add(a,b) return a+bend

      和(he)C++不(bu)同(tong)的是,lua的函(han)數可以一(yi)次返回多個變量(liang),比如下面這樣寫是完(wan)全(quan)沒有問題的︰

      

    function Increse(a,b) return a+1,b+1enda=2,b=4;a,b=Increase(a,b)print(a,b)

      (5)Table表

        table是Lua中一(yi)種非常重要也(ye)非常強大的數據類型,你可以把表看成一(yi)種關(guan)聯數組或者哈(ha)希表。這意味(wei)著(zhou)你不(bu)但可以用(yong)整數來索引一(yi)個表,也(ye)可以yun)褂yong)任何類型的鍵值來索引一(yi)個表,而且lua的表是混(hun)合類型的,它們可以包(bao)含不(bu)同(tong)的數據類型。

      

    --創建一(yi)個tablemy_table={}--添加一(yi)些數據到表中my_table[1]=2333my_table[2]=666my_table[3]='HelloWorld'--或者你也(ye)可以一(yi)次性的初始化(hua)一(yi)個表my_table={2333,666,'HelloWorld'}--關(guan)聯索引my_table['one']=2333my_table[6]='Study'--除了使用(yong)[]以外(wai),我們還可以yun)褂yong).來存取一(yi)個值my_table.one =2333--函(han)數也(ye)可以賦值給表function add(a,b) return a+bendmy_table={}my_table['add']=add print(my_table.add(2,3))

      (6)UserData用(yong)戶數據

        userdata類型允(yun)許Lua變量(liang)存儲(chu)定(ding)制(zhi)的C/C++數據。一(yi)個userdata類型的變量(liang)不(bu)能在Lua中創建和(he)修改,只有通過C/C++接(jie)口才可以(下篇我們會介紹(shao)這種方法)。

      (7)Thread線程

        通過這種類型,我們可以產生並(bing)運行新(xin)的線程

      3.邏輯操作符

      Lua中有三種邏輯操作符,分別是︰and,or,和(he)not。他們和(he)C++中的&&、和(he)!很像,並(bing)且和(he)C++一(yi)樣,只有在必要的情(qing)況(kuang)下,他們才會檢查(cha)第二個條件。nil和(he)false為假,其他都(du)為真。

      4.條件結構

      Lua中提供了ifwhile epeat or幾種條件結構。lua的幾個版本的if和(he)while控(kong)制(zhi)ping) 購he)C++很類似,只不(bu)過lua中條件不(bu)需要寫在小(xiao)括號中xiao)/p>

      

    if a==4 then print('four')else print('other')end--while循環(huan)while a<=100 then a=a+1endprint(a)--while和(he)if語句(ju)都(du)已end關(guan)鍵字結束--repeat和(he)until關(guan)鍵字一(yi)起聯用(yong),就像這樣︰repeat a=a+1 print(a) until a==100--for結構有兩個版本,一(yi)個用(yong)于數字,一(yi)個用(yong)于表--用(yong)于數字的for循環(huan)的語法︰for var=low_value,high_value,step doxxxxxxend--舉例for a=10,20,2 doprint(a)end

      和(he)C/C++一(yi)樣,你也(ye)可以yun)褂yong)break來退出循環(huan)。

      另外(wai)還有一(yi)種for循環(huan)用(yong)來遍歷表

    --語法for key,value in table doxxxxxend

      key和(he)value分別代表鍵和(he)值,table就是我們要遍歷的表。

      

    --舉例my_table={a=1,b=2,c=3}for k,v in my_table do print(k,v)end

      到現在,我們已經(jing)稍微對Lua有了一(yi)些了解,但是我們還不(bu)能用(yong)它來為我們的游(you)戲程序(xu)服(fu)務。下篇我們將共同(tong)學習Lua和(he)C/C++的接(jie)口,以及Lua如何應用(yong)在Cocos2d-X和(he)Unity引擎中xiao)/p>

    作者︰馬三小(xiao)伙兒
    出處︰http://www.cnblogs.com/msxh/p/6033679.html 
    請尊(zun)重別人的勞(lao)動成果(guo),讓分享成為一(yi)種美(mei)德,歡迎轉載。另外(wai),文章在表述和(he)代碼方面如有不(bu)妥之(zhi)處,歡迎批(pi)評指正(zheng)。留下你的腳印,歡迎評論(lun)! 

About IT165 -廣告服(fu)務 -1分快三官网隱(yin)私聲明 -版權申明 -免責條款 -網站地圖 -網友(you)投稿 -聯系(xi)方式
本站內容(rong)來自于互聯網,僅供用(yong)于網絡(luo)技術學習,學習中請遵循相(xiang)關(guan)法律法規
甘肃福彩网官网 | 下一页