編譯最優(yōu)化jass基礎(chǔ)教程_第1頁(yè)
編譯最優(yōu)化jass基礎(chǔ)教程_第2頁(yè)
編譯最優(yōu)化jass基礎(chǔ)教程_第3頁(yè)
編譯最優(yōu)化jass基礎(chǔ)教程_第4頁(yè)
編譯最優(yōu)化jass基礎(chǔ)教程_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Greedwind 教學(xué) Jass 基礎(chǔ)一這個(gè)假設(shè)你已經(jīng)比較熟練地使用 Trigger 并有一定的邏輯基礎(chǔ)和程序設(shè)計(jì)基礎(chǔ), Knowning engish ispreferable首先問(wèn)個(gè)問(wèn)題: 為什么要學(xué) JASS?先看下面的例子:以下例子可以實(shí)現(xiàn)在例子:Events:A unit diesConditions: Actions:的位置顯示5秒的信息(漂浮文字)后并清除信息嗎?-Floating Text - Create floating tex(ition of (Triggering Unit)with the message (A +(name of (Triggering Unit

2、) + dies) with size 20 , red 100, green 100, blue 0, alpha 100.-Wait 5.00 seconds-Destroy (last created floating text)象以上例子, 如果不使用用局部變量, 將無(wú)法準(zhǔn)確銷毀臨時(shí)漂浮文字. 因?yàn)樵诘却?秒后(-Wait 5.00 seconds), 最近創(chuàng)建的漂浮文字(last created floating text)可能已經(jīng)不是原來(lái)的那個(gè)了!)要達(dá)到目的, 必須對(duì) JASS 有些了解.將對(duì)此 TRIGGER 作進(jìn)一步的分析.jass 基礎(chǔ)學(xué)新的程序設(shè)計(jì)語(yǔ)言, 要先學(xué)它的變量類

3、型.之變量篇首先提醒大家: Jass2是區(qū)分大小寫(xiě)的, 如 ABcd 和 ABCD 是不一樣的.Jass2 變量類型變量相當(dāng)于物件的箱子, JASS2很多的變量類型只是個(gè)指針(變量地址).使用變量前必須要首先看個(gè)簡(jiǎn)單的例子:變量類型和變量名稱.local string my1stvar /1個(gè)字符型局部變量, 起名為 my1stvar set my1stvar = GreedWind /把GreedWind賦值給變量 my1stvar以后的程序中就可以直接/重新賦值 my1stvar變量(除了數(shù)組變量)可以在語(yǔ)句中初始化, 上面可以簡(jiǎn)化成:local string my1stvar = Gre

4、edWind /JASS2有哪些變量類型呢?字符型局部變量 my1stvar 并賦值為GreedWind用 WORLD EDITOR 和Jass2變量類型做對(duì)照便一目了然了WORLD EDITOR 和 JASS 變量類型對(duì)照表:World Editor 變量名Jass 變量類型型(用于真/假判斷)Destructibledestructable 可破壞物DialogdialogDialog Buttonbutton 按鈕Floating Texttexttag 漂浮文字egereger 數(shù)值Itemitem 物品Leaderboardleaderboard榜Playlayer 玩家Player

5、 Groupforce 玩家組Polocation 位置(點(diǎn))Realreal 真值型數(shù)字Regionrect 地區(qū)Spel Effecteffect 特效Stringstring 字符串Terrain Deformationterraindeformation 地形Timertimer 計(jì)時(shí)器Timer Windowtimerdialog 計(jì)時(shí)器窗口UnitunitUnit Groupgroup組Player Scoreplayerscore 積分(1.13版新類型)World Editor 中的 Order(命令) , Ability(技能) , Unit Type(類型), Destru

6、ctible type(可破壞物類型) 和 Item type(物品類型) 在 JASS 中對(duì)應(yīng)的變量類型實(shí)際上是eger??梢杂脝我?hào)示這些類型的值x(x 為在 World Editor 用 View as raw data(以行數(shù)據(jù)查看)中看到的代碼)表Jass 基本變量類型egereger(數(shù)值)是的范圍在 -2147483648 和 2147483647 之間的整數(shù), 不能有小數(shù)位在 Jass 中eger 的幾中特殊形式:1.x 單引號(hào)加字符形式,該形式為256進(jìn)制整數(shù),每個(gè)字符代表其 AscII 碼值,區(qū)分大小寫(xiě),一般用來(lái)表示到)2.0、物品、技能等代碼。比如對(duì)戰(zhàn)里劍圣的代碼是 Ob

7、la(在物編中按 Ctrl+D 可以看8進(jìn)制數(shù)字,首位為0表示8進(jìn)制數(shù)字3.0Xaa 16進(jìn)制數(shù)字,以0 x 開(kāi)頭的表示16進(jìn)制數(shù)字realreal 是范圍很大的32字節(jié)數(shù)字, 可以有小數(shù)位, 123456.33就是 real小數(shù)點(diǎn)前或后是0的話,可以省略這個(gè)0;比如0.34=.34 4.0=4. 0.0可以寫(xiě)成0.或.0,但不能都省略的值只有 true(真)和 false(假), 多用于條件判斷語(yǔ)句if (條件=true) then(符合條件做某事) else(不符合條件就做另一件事)endif stringstring 是字符串變量, 可以是null(空值). 注意Jass 的字符串是大小

8、寫(xiě)區(qū)分的, 賦值時(shí)引號(hào) handlehandle 句柄, 可以是 null(空值). 是用于指向 Warcraft III 定義的數(shù)據(jù)結(jié)構(gòu)的指針. 比如上表中的location/player 等除了codeeger/real/boean/string 外的的變量實(shí)際上就是 handle 類型的子變量code(程序代碼), 可以是 null(空值). 函數(shù)可以有 code 類型的傳遞參數(shù), 表示該函數(shù)必須要有其他函數(shù)作為參數(shù), 如:function RunFunctionForAllPlayers takes code theFunction returns nothing可以這樣調(diào)用函數(shù): c

9、all RunFunctionForAllPlayers(function someFunction) / 先運(yùn)行someFunction也可以: call RunFunctionForAllPlayers(null) /不運(yùn)行其他函數(shù)用戶定義變量類型正如上面所說(shuō), 上表中 location/player 等除了eger/real/boean/string 外的類型實(shí)際上就是handle 類型的子類型, 這些變量就是用戶類型變量, 實(shí)際就是一個(gè)數(shù)據(jù)結(jié)構(gòu)的指針.數(shù)組是指一組同類型的有序列的變量. 數(shù)組中包含的元素可以用n來(lái)指明(n 表示第 n + 1個(gè)元素, 從 0算起).以上所說(shuō)的變量類型中除

10、了 code 類型, 其他類型的變量都可以定義數(shù)組變量, 如locateeger array dropitemsset dropitems0 = .xset dropitems18 = Xbbbdropitems18指 dropitems 中第19個(gè)變量.注意:1) 數(shù)組所有元素初始值是空, 比如eger 類型的數(shù)組初始值為0, handle 類型初始值的為 null數(shù)組不能直接再次初始化, 只能數(shù)組按元素賦值, 如:locate string array playername = Greedwind /數(shù)組賦值locate string array playername /數(shù)組元素只能逐個(gè)賦

11、值 set playername1 = Greedwindset playername2 = Greedwinds girlfriend unit array myUnitsunit array yourUnits.myUnits = yourUnits /set myUnits0 = yourUnits10 / 合法數(shù)組在函數(shù)間不能互相傳遞. 即是不能把數(shù)組作為函數(shù)參數(shù), 而且函數(shù)也不能返回?cái)?shù)組類型的變set量.4) 數(shù)組元素域在 0 和 JASS_MAX_ARRAY_SIZE = 8192 之間, 即是最多有 JASS_MAX_ARRAY_SIZE + 1 個(gè)元素. JASS_MAX_AR

12、RAY_SIZE 是在 common.j 中定義的常數(shù)有問(wèn)有答1)全局變量和局部變量, 怎樣和使用變量?首先要了解, 從作用范圍來(lái)區(qū)分, 變量有全局變量和局部變量.全局變量作用于Jass 程序的全部分, 即是如果全局變量abc 在某個(gè)函數(shù)中改變了值, 這個(gè)值也將影響其他了 abc 變量的函數(shù).全局變量globals格式:變量類型 變量名稱 = 初始值 /有初始化的全局變量變量類型 變量名稱 /無(wú)初始化的全局變量變量類型 array 變量名稱 /數(shù)組全局變量, 不能再次初始化賦值.endglobals局部變量只作用于函數(shù)不影響全局變量 abc 的值., 即是如果在函數(shù)定義了局部變量 abc, a

13、bc 的值只影響該函數(shù),局部變量格式:local 變量類型 變量名稱 = 初始值 /有初始化的局部變量 local 變量類型 變量名稱 /無(wú)初始化的局部變量local 變量類型 array 變量名稱 /數(shù)組局部變量, 不能再次初始化賦值注意:1) 不論是全局變量還是局部變量, 必須在程序開(kāi)始部分首先即是全局變量總是在程序文件的最前端,而局部變量總是在函數(shù)的最前面.在 Trigger Editor 用變量管理器(Ctrl + B)中定義的變量都是全局變量在 Trigger Editor 的循環(huán) GUI 語(yǔ)句 For Loop (eger A)和 For Loop ( eger B)都是全局變量實(shí)

14、例:globalseger abc = 5188 endglobals.function myfunc1 takes nothing returns nothing localeger abcset abc = 1233 endfunctionfunction myfunc1 takes nothing returns nothinglocaleger myeger B)中的(egerA)(set my= abcset abc = 0 endfunction如果按順序調(diào)用函數(shù) myfunc1 和 myfunc1, 那么在函數(shù) myfunc2中的 my值又是多少?的值是多少呢, abc 最終是:

15、= 5188, abc 最終值為 02)怎樣在 Trigger Edit(有關(guān)在 Trigger EditUI)中使用局部變量?UI)中使用局部變量詳細(xì)方法請(qǐng)參看簽名中的- 3c 的內(nèi)存泄漏)GUI 中不能直接局部變量,但是可以使用全局變量作為中介首先定義變量類型。定義變量類型的語(yǔ)句只能放在 TIGGER 的開(kāi)頭,不然會(huì)出現(xiàn)編譯錯(cuò)誤定義變量類型:要用:Custom Script - Action語(yǔ)法:Custom Script: local 變量類型請(qǐng)參看 WORLD EDITOR 和 JASS 變量類型對(duì)應(yīng)表例如:-變量Custom Script: locait u-組變量Custom Sc

16、ript: local group g然后將它們賦值給臨時(shí)全局變量就可以在 GUI 里調(diào)用該值了,注意全局變量要加前綴udg_Custom Script: set udg_TempUnit=u局部變量的使用:在變量表(Control + B)中先定義好同類型臨時(shí)變量(不要加前綴 udg_)的變量,該變量可以在多個(gè)觸發(fā)里重復(fù)利用(在變量表中定義此變量是為了方便 TIGGER EDITOR該變量。)以下例子實(shí)現(xiàn)了在的位置顯示5秒的信息(漂浮文字)(象這種例子, 如果不使用用局部變量, 將無(wú)法準(zhǔn)確銷毀臨時(shí)漂浮文字(-Destroy (diesmessage).因?yàn)樵诘却?秒后(-Wait 5.00

17、seconds), 最近創(chuàng)建的漂浮文字(last created floating text)可能已經(jīng)不是原來(lái)的那個(gè)了 )例子:Events:A unit dies Conditions:Actions:-Custom Script: local texttag diesmessage-Custom Script: set udg_TempTextTag = diesmessage /注意要添加udg_前綴-Floating Text - Create floating tex(ition of (Triggering Unit)with the message (A+(name of (Tr

18、iggering Unit) + dies) with size 20 , red 100, green 100, blue 0, alpha 100.-Set TempTextTag= (last created floating text)-Wait 5.00 seconds-Custom Script: set udg_TempTextTag = diesmessage-Destroy (TempTextTag)注意:不要利用同名覆蓋的方法在 GUI 中使用局部變量!(即以 udg_開(kāi)頭的局部變量與已定義全局變量名字相同)該方法在觸發(fā)內(nèi)該類同名變量數(shù)量=2時(shí)會(huì)出現(xiàn)嚴(yán)重 Bug!jass

19、基礎(chǔ)之常見(jiàn)問(wèn)題篇1)全局變量和局部變量, 怎樣和使用變量?首先要了解, 從作用范圍來(lái)區(qū)分, 變量有全局變量和局部變量.全局變量作用于Jass 程序的全部分, 即是如果全局變量abc 在某個(gè)函數(shù)中改變了值, 這個(gè)值也將影響其他了 abc 變量的函數(shù).全局變量格式:globals變量類型 變量名稱 = 初始值 /有初始化的全局變量變量類型 變量名稱 /無(wú)初始化的全局變量變量類型 array 變量名稱 /數(shù)組全局變量, 不能再次初始化賦值.endglobals局部變量只作用于函數(shù)不影響全局變量 abc 的值., 即是如果在函數(shù)定義了局部變量 abc, abc 的值只影響該函數(shù),局部變量格式:loca

20、l 變量類型 變量名稱 = 初始值 /有初始化的局部變量 local 變量類型 變量名稱 /無(wú)初始化的局部變量local 變量類型 array 變量名稱 /數(shù)組局部變量, 不能再次初始化賦值注意:1) 不論是全局變量還是局部變量, 必須在程序開(kāi)始部分首先即是全局變量總是在程序文件的最前端,而局部變量總是在函數(shù)的最前面.在 Trigger Editor 用變量管理器(Ctrl + B)中定義的變量都是全局變量在 Trigger Editor 的循環(huán) GUI 語(yǔ)句 For Loop (eger A)和 For Loop ( eger B)都是全局變量實(shí)例:globalseger abc = 518

21、8 endglobals.function myfunc1 takes nothing returns nothing localeger abcset abc = 1233 endfunctionfunction myfunc1 takes nothing returns nothinglocaleger myeger B)中的(egerA)(set my= abcset abc = 0 endfunction如果按順序調(diào)用函數(shù) myfunc1 和 myfunc1, 那么在函數(shù) myfunc2中的 my值又是多少?的值是多少呢, abc 最終是:= 5188, abc 最終值為 02)怎樣在

22、 Trigger Edit(有關(guān)在 Trigger EditUI)中使用局部變量?UI)中使用局部變量詳細(xì)方法請(qǐng)參看簽名中的- 3c 的內(nèi)存泄漏)GUI 中不能直接局部變量,但是可以使用全局變量作為中介首先定義變量類型。定義變量類型的語(yǔ)句只能放在 TIGGER 的開(kāi)頭,不然會(huì)出現(xiàn)編譯錯(cuò)誤定義變量類型:要用:Custom Script - Action語(yǔ)法:Custom Script: local 變量類型請(qǐng)參看 WORLD EDITOR 和 JASS 變量類型對(duì)應(yīng)表例如:-變量Custom Script: locait u-組變量Custom Script: local group g然后將它

23、們賦值給臨時(shí)全局變量就可以在 GUI 里調(diào)用該值了,注意全局變量要加前綴udg_Custom Script: set udg_TempUnit=u局部變量的使用:在變量表(Control + B)中先定義好同類型臨時(shí)變量(不要加前綴 udg_)的變量,該變量可以在多個(gè)觸發(fā)里重復(fù)利用(在變量表中定義此變量是為了方便 TIGGER EDITOR該變量。)以下例子實(shí)現(xiàn)了在的位置顯示5秒的信息(漂浮文字)(象這種例子, 如果不使用用局部變量, 將無(wú)法準(zhǔn)確銷毀臨時(shí)漂浮文字(-Destroy (diesmessage).因?yàn)樵诘却?秒后(-Wait 5.00 seconds), 最近創(chuàng)建的漂浮文字(las

24、t created floating text)可能已經(jīng)不是原來(lái)的那個(gè)了 )例子:Events:A unit dies Conditions:Actions:-Custom Script: local texttag diesmessage-Custom Script: set udg_TempTextTag = diesmessage /注意要添加udg_前綴-Floating Text - Create floating tex(ition of (Triggering Unit)with the message (A+(name of (Triggering Unit) + dies)

25、with size 20 , red 100, green 100, blue 0, alpha 100.-Set TempTextTag= (last created floating text)-Wait 5.00 seconds-Custom Script: set udg_TempTextTag = diesmessage-Destroy (TempTextTag)注意:不要利用同名覆蓋的方法在 GUI 中使用局部變量!(即以 udg_開(kāi)頭的局部變量與已定義全局變量名字相同)該方法在觸發(fā)內(nèi)該類同名變量數(shù)量=2時(shí)會(huì)出現(xiàn)嚴(yán)重 Bug!jass 基礎(chǔ)之四函數(shù)篇如果你仔細(xì)讀完并讀懂前面兩章,

26、應(yīng)該對(duì) Jass 函數(shù)并不陌生了. 也許我兩章寫(xiě)的太過(guò)綜合緊湊, 所以寫(xiě)到這覺(jué)得沒(méi)什么好寫(xiě)了. 不管怎樣, 還是需要進(jìn)一步深入了解 Jass 函數(shù)規(guī)范和注意事項(xiàng).注意, 在此章中不是教你動(dòng)手寫(xiě)Jass 函數(shù), 而是讓你基本可以讀懂別人寫(xiě)的Jass-如果你英文足夠好而且不傻(這是 Jass 中并立條件, 上一章提到過(guò)).可以在 Trigger Editor 中把一些簡(jiǎn)單的觸發(fā)器(Trigger)轉(zhuǎn)化成自定義, 因?yàn)槭孪戎莱绦蜻壿? 這樣讀起來(lái)也比較容易.1)函數(shù)定義要素語(yǔ)法格式function 函數(shù)名 takes 參數(shù)表 returns 返回類型局部變量局部變量.表達(dá)式表達(dá)式表達(dá)式.retur

27、n 返回表達(dá)式endfunction其中:定義函數(shù)的關(guān)鍵字有: function . endfunction, takes, returns函數(shù)名的首個(gè)字母不能是數(shù)字, 函數(shù)名中不能有第2章中所說(shuō)的操作符, 特殊字符和多數(shù)非字母符號(hào)(如: 空格!#$%&*()-+=|;:?,./), 也不能使用中文. 函數(shù)命名要盡量簡(jiǎn)明易懂, 突出函數(shù)功能.c) 參數(shù)表是規(guī)定傳遞入函數(shù)的數(shù)據(jù)類型和參數(shù)數(shù)量, 作用是函數(shù)間的逗號(hào)( , )分開(kāi). 不能定義數(shù)組作為參數(shù), 這點(diǎn)在的第一章已經(jīng)做了說(shuō)明.參數(shù)必須規(guī)定數(shù)據(jù)類型或者是無(wú)參數(shù), 如function myfunction1 takes nothing retu

28、rns nothing endfunction(輸入), 參數(shù)之間用function myfunction2 takeseger creatnum, unit myunit returnscall CreateNUnitsoc(creatnum, GetUnitTypeId(myunit), Player(1),GetUnitLoc(GetTriggeringUnit(), bj_UNIT_FACING ) return trueendfunctionmyfunction1為無(wú)參數(shù)的函數(shù), 調(diào)用時(shí)不需要傳遞參數(shù), 即是用 call myfunction1()myfunction1為2參數(shù)函數(shù),

29、 參數(shù)類型規(guī)定為eger 和 unit. 調(diào)用 myfunction2時(shí)必須同時(shí)傳遞數(shù)據(jù)類型分別eger 和 unit 的參數(shù), 或者傳遞入空值(參看第二章的舉例).注意: 數(shù)字的空值為 0, handle(句柄)類型及其子類別的空值為 null. 關(guān)于 handle 類型請(qǐng)參看第一章. 我在本章背后會(huì)列出各數(shù)據(jù)類型所對(duì)應(yīng)的空值.d) 返回類型是規(guī)定函數(shù)返回的數(shù)據(jù)類型, 作用同樣是函數(shù)間的nothing 說(shuō)明沒(méi)有返回參數(shù)(輸出), 可以用 returnse) 局部變量必須寫(xiě)在函數(shù)開(kāi)始部分. Jass 總是先, 再使用. 如:function myfunction3 takes nothing

30、returns nothinglocallocaleger i = 5eger j = 10call myfunction2(i, sleep(360)call myfunction2(j, endfunction下面的函數(shù)是錯(cuò)誤的:)function myfunction3 takes nothing returns nothinglocaleger i = 5call myfunction2(i,)localeger j = 10sleep(360)call myfunction2(j,endfunction)f) 表達(dá)式是函數(shù)的 骨干 , 是邏 輯的實(shí)現(xiàn)部 分 . 寫(xiě)好這 部分 , 需

31、要對(duì) common.j,mond.ai 有一定的了解.g) 返回表達(dá)式的值必須和該函數(shù)時(shí)的返回類型一致, 不要返回為恐龍類型, 卻偷梁換柱返回個(gè). 返回值不能是數(shù)組.2) 程序執(zhí)行函數(shù)每個(gè) Jass在觸發(fā)器文件都需要定義執(zhí)行程序的函數(shù)文件 war3map.j 中, config()和 main()是函數(shù).config()函數(shù)作用是在開(kāi)始狀態(tài)等.之前初始化地圖, 如按設(shè)計(jì)時(shí)指定點(diǎn)放置/可破壞物,初始化main()函數(shù)在開(kāi)始才執(zhí)行.在 AI文件中, 用戶需自定義 main()函數(shù)作為該文件的程序.文件執(zhí)行function ma函數(shù)的固定格式:akes nothing returns nothing

32、 /觸發(fā)器和 AI均使用function config takes nothing returns nothing /觸發(fā)器使用注意: 一張地圖中只能有1個(gè)觸發(fā)器文件 war3map.j, 此文件包含在 w3m 或 w3x 中一張地圖中可以包含多個(gè) AI有問(wèn)有答:文件, 輸入 AI文件的目錄為: scripts1)當(dāng)變量loca在上句空值? 不同數(shù)據(jù)類型的空值是什么?時(shí), 如果在it myunit語(yǔ)句中不直接賦值, 則該變量的初始化值為空值, 表示沒(méi)有賦值. 如:中, myunit 沒(méi)有直接賦值, 那么 myunit 在后值是 null以下是數(shù)據(jù)類型的空值對(duì)應(yīng)表WORLD EDITOR 和 J

33、ASS 變量類型對(duì)照表:World Editor變量名 Jass 變量類型 空值型(用于真/假判斷) false Destructible destructable 可破壞物 nullDialog dialognullDialog Button button 按鈕 null Floating Text texttag 漂浮文字 nullegereger 數(shù)值 0Item item 物品 nullLeaderboard leaderboardPlayer player 玩家 null榜 nullPlayer Group force 玩家組 null Polocation 位置(點(diǎn)) null R

34、eal real 真值型數(shù)字 nullRegion rect 地區(qū) 0Spel Effect effect 特效 nullString string 字符串 nullTerrain Deformation terraindeformation 地形 null Timer timer 計(jì)時(shí)器 nullTimer Window timerdialog 計(jì)時(shí)器窗口 nullUnit unitnullUnit Group group組 nullPlayer Score playerscore 積分(1.13版新類型) null由上表可以看出, 除了eger, real 的空值為 0 和的空值為 fal

35、se 以外, 其他數(shù)據(jù)類型外, 其他數(shù)據(jù)類型都是 handle(句柄)的子的空值都是 null. 原因很簡(jiǎn)單: 除了eger, real,類型, handle 類型的空值為 null, 它的兒子們也跟著 null 到底了.2)common.j, Blizzard.j, common.ai?這3個(gè)文件都是支持 War3 Jass 的公共庫(kù)文件, 文件里面包含和用的函數(shù)和全局變量.了所有(幾乎是所有)Jass 可以調(diào)common.j 是最基礎(chǔ)的 API 庫(kù)文件, 在Trigger Jass 和 AI Jass 中都可以調(diào)用.Blizzard.j 包含使用 Trigger Editor 時(shí)生成的 T

36、rigger Jass 中經(jīng)常調(diào)用的庫(kù)函數(shù)/全局變量, 實(shí)際上是基于 common.j 寫(xiě)的子函數(shù). Blizzard.j 只能在 Trigger Jass 中調(diào)用.common.ai 只能在 AI Jass 中調(diào)用, 它有 AI 中需要使用的函數(shù)和全局變量.注意: 在 Trigger Jass 中, 不能調(diào)用 common.ai 中的函數(shù)和全局變量; 同樣地, 在 AI Jass 中, 也不能使用 Blizzard.j 的函數(shù)和全局變量.3) 如何獲得的 common.j, Blizzard.j, common.ai?在 war3.mpq/war3x.mpq/war3patpq 都有 com

37、momon.ai, 要獲得版本的文件, 可以用 WPQ 打開(kāi) war3patpq, 在 WPQ 右上方的輸入框中輸入: scripts* ,如果你的war3patpq 沒(méi)有加密過(guò), 那么可以找到這3個(gè)文件. 如果是加密過(guò)的, 則需要把 war3patpq 的文件全部解壓到臨時(shí)目錄, 然后用 Ultra-Edit 中的在文件中搜索字符的功能尋找這3個(gè)文件.4) 可以在自己的地圖中使用自定義的 common.j, Blizzard.j, common.ai 嗎?可以. 用輸入管理器輸入自定義的 common.j, Blizzard.j, common.ai, 輸入目錄應(yīng)為scripts. 這樣,

38、運(yùn)行地圖中的時(shí), War3就不會(huì)到 war3patpq 尋找這3個(gè)文件了而直接從地圖中的scripts目錄調(diào)用. 這樣做的好處就是可以使庫(kù)文件的同步一致. 通常, 版本相同的WAR3, 其庫(kù)文件也相同, 所以多數(shù)時(shí)候不需要在地圖中輸入這3個(gè)文件. 但如果你更改了這3個(gè)基本文件來(lái)支持你的Jass, 或者確保為了庫(kù)文件的一致性, 便可以在地圖中輸入基礎(chǔ)庫(kù)文件.5) 怎么解讀公共庫(kù)文件(common.j, Blizzard.j, common.ai)的函數(shù)/全局變量?Blizzard 對(duì)函數(shù)/全局變量 名是相當(dāng)規(guī)范簡(jiǎn)明易懂的(當(dāng)然需要一定的英文基礎(chǔ)), 它定義的函數(shù)/全局變量的名基本上是英語(yǔ)語(yǔ)句.

39、我舉些例子:native CreateUnit takes player id,eger unitid, real x, real y, real face returns unit本地函數(shù) CreateUnit() 即是 Create Unit, 意思為創(chuàng)建, 從參數(shù)表(takes 和 returns 之間的聲明)來(lái)看, 這個(gè)函數(shù)需要輸入玩家,編碼, 坐標(biāo) x, 坐標(biāo) y, 方向角度, 返回值是類型變量.從函數(shù)的名字和參數(shù)表, 可以猜測(cè)/確認(rèn) CreateUnit()是用來(lái)在地圖的 x/y 坐標(biāo)中為指定玩家創(chuàng)建指定, 并且使創(chuàng)建面向所定義的角度, 返回值是創(chuàng)建.在地圖函數(shù) main()中,

40、CreateUnit()被大量調(diào)用, 用來(lái)重現(xiàn)地圖設(shè)計(jì)時(shí)用 WORLD EDITUI)放置的.注意: 就如前面所,eger 可以用單引號(hào)括起4個(gè)英文字母/數(shù)字來(lái)表示. 所以 CreateUnit()中x來(lái)表示. 如:eger unitid 參數(shù)可以用 set u = CreateUnit( Player(5), ndgt, -2944.0, -3136.0, 270.000 )上句意思是為玩家5在地圖坐標(biāo)(-2944.0, -3136.0)中創(chuàng)建編碼為ndgt的, 并使創(chuàng)建面向角度為270度, 然后把創(chuàng)建保存在變量u 中.總結(jié)下 Blizzard 函數(shù)名/全局變量名的規(guī)律:前墜 Get 取得某

41、屬性, 此類函數(shù)一般有返回值前綴 Set 設(shè)置某屬性c) 前綴 Is 是否判斷, 此類函數(shù)返回類型都是, 返回 true 或 falsed) 中間有2 數(shù)據(jù)類型轉(zhuǎn)化函數(shù), 如 S2I(), I2R, I2S()等e) 有 Item/Unit/. 肯定是與物品/.相關(guān)的函數(shù)后綴 BJ 此函數(shù)肯定是在 Blizzard.j 中定義的, 不能在 AI 中使用.前綴 bj_ 在 Blizzard.j 中定義的全局常量(常量是指定義并賦值后不能再改變的值)前綴 Create 創(chuàng)建前綴 Remove 移除k) 全部大寫(xiě) 在 common.j 中定義的全局常量6) 實(shí)用問(wèn)題: 如何創(chuàng)建外觀隨機(jī)可變的地圖?上

42、面, main() 是地圖函數(shù), 在 main() 調(diào)用了一些再現(xiàn)地圖設(shè)計(jì)時(shí)原貌的子函數(shù)如CreateAlits(). 因此,可以在 CreateAlits()中加入隨機(jī)函數(shù) GetRandom()來(lái)控制/物品/可破壞物等初始化過(guò)程.可以用 Wwar3map.j 后, 再用WPQ 打開(kāi)要修改的地圖, 提取 war3map.j 來(lái)修改 main()函數(shù)及其相關(guān)函數(shù). 修改完P(guān)Q 導(dǎo)入修改后的 war3map.j.a) 函數(shù)修改/增加方法:這是3C 地圖中的 CreateAlits()函數(shù)function CreateAlits takes nothing returns nothingcall

43、CreateNeutralPassiveBuildings() /用戶自定義函數(shù) call CreatePlayerBuildings() /用戶自定義函數(shù)call CreateNeutralHostile() /用戶自定義函數(shù) call CreateNeutralPassive() /用戶自定義函數(shù) call CreatePlayerUnits() /用戶自定義函數(shù)endfunction注意: CreateAlits()也不是庫(kù)函數(shù), 是用戶自定義函數(shù)):可以根據(jù) CreateAlits()創(chuàng)建另一個(gè)函數(shù):function CreateAlitsRandom takes nothing re

44、turns nothing/ random是 1,2,3中的隨機(jī)數(shù)localeger random= GetRandom(1, 3)call CreateNeutralPassiveBuildingsRandom(random)call CreatePlayerBuildingsRandom(random call CreateNeutralHostileRandom(randomcall CreateNeutralPassiveRandom(random)call CreatePlayerUnitsRandom(randomendfunction)因?yàn)樵瓉?lái)調(diào)用的函數(shù)都是無(wú)參數(shù)函數(shù), 所以相應(yīng)

45、的函數(shù)應(yīng)該做些修改, 如:/創(chuàng)建玩家, 以 CreatePlayerUnits()為藍(lán)本增加新函數(shù)function CreatePlayerUnitsRandom takeseger randomreturns nothing/此函數(shù)以 CreateUnitsForPlayer0為藍(lán)本增加新函數(shù)call CreateUnitsForPlayer0Random(random.endfunction/創(chuàng)建中立)/此函數(shù)以 CreateNeutralHostile 為藍(lán)本增加新函數(shù)function CreateNeutralHostileRandomeger randomreturns nothin

46、glocal play= PlayLAYER_NEUTRAL_AGGRESSIVE)localocalit ueger unitIDlocal trigger t local real life/加入條件控制, 根據(jù)隨機(jī)數(shù)創(chuàng)建不同組合.if random/可掉寶物的= 1 thenset u = CreateUnit( p, nC26, -6533.2, 445.1, 220.680 )set t = CreateTrigger( )call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DEATH )call TriggerRegisterUnitEv

47、ent( t, u, EVENT_UNIT_CHANGE_OWNER ) call TriggerAddAction( t, function Unit000012_DropItems )/不掉寶物set u = CreateUnit( p, nelb, -373.5, 3533.4, 44.518 ) set u = CreateUnit( p, nomg, -233.6, 3436.2, 140.871 )elseif random/不掉寶物= 2 thenset u = CreateUnit( p, a001, -373.5, 3533.4, 44.518 ) set u = Creat

48、eUnit( p, a002, -233.6, 3436.2, 140.871 )else.endif endfunction別忘了修改 main()function ma.akes nothing returns nothing/call CreateAlits() /原版的初始化函數(shù), 不再使用call CreateAlitsRandom() /使用新的.endfunction初始化函數(shù)b) 初始設(shè)置方法:問(wèn)題的關(guān)鍵就是, 這么多初始, 怎么樣修改起來(lái)不累人?這里介紹法:先把要修改的地圖修改地圖初始的類型/位置/寶物等, 刪除所有 TRIGGER, 并保存地圖, 提取 war3map.j3

49、. 用W 4.5. 把PQ 打開(kāi)war3map.j 中對(duì)應(yīng)函數(shù)中創(chuàng)建的語(yǔ)句的語(yǔ)句粘貼在原地圖中相應(yīng)函數(shù)的適當(dāng)位置6. 重復(fù)1-5,的隨機(jī)初始化設(shè)置注意: 如果用 World Editor 再次修改并保存, main()將使用 GUI 默認(rèn)生成的 call CreateAlits(),而不是 call CreateAlitsRandom(). 此時(shí)還需要打開(kāi) war3map.j 修改 main()函數(shù).同樣, 使可破壞物等初始設(shè)置有隨化也可以用此方法.jass 基礎(chǔ)之五庫(kù)函數(shù)這章是 Jass 基礎(chǔ)中最難的部分, 也是最實(shí)用的部分.Jass 的關(guān)鍵字有26個(gè), 跟英文字母一樣多.來(lái)回顧一下:and

50、, array, call, constant, else, elseif, endfunction, endglobals, endif, endloop, exitwhen, extends, function, globals, if, local, loop, native, not, or, return, returns, set, takes, type, then以此看來(lái), Jass 是語(yǔ)法結(jié)構(gòu)最簡(jiǎn)單的一種準(zhǔn)計(jì)算機(jī)語(yǔ)言. Jass 實(shí)現(xiàn)功能基本依靠調(diào)用 common.j, blizzad.j, common.ai 中的庫(kù)函數(shù).本章所述內(nèi)容不屬于 Jass 語(yǔ)法部分, 最主要講述

51、:觸發(fā)器(Triggers)跨通訊(er-Script Communication)隊(duì)列(Enumerations)隊(duì)列過(guò)濾器(Filters)線程(Threads)1) 觸發(fā)器(Triggers)觸發(fā)器用于地圖觸發(fā)器(Trigger Jass), 用于響應(yīng)特定事件. 它是種響應(yīng)信號(hào)(callback), 觸發(fā)器不能應(yīng)用于 AI, 即是說(shuō) AI Jass 中不能有觸發(fā)器的語(yǔ)句.觸發(fā)器包含創(chuàng)建觸發(fā)器, 設(shè)置觸發(fā)條件, 設(shè)置動(dòng)作. a)創(chuàng)建觸發(fā)器觸發(fā)器的數(shù)據(jù)類型為 trigger(觸發(fā)器), 是 handle(句柄)的子類型.創(chuàng)建觸發(fā)器的函數(shù)在 common.j 中的:native CreateT

52、rigger takes nothing returns trigger參數(shù):nothing /無(wú)參數(shù)返回:trigger /返回創(chuàng)建的觸發(fā)器使用格式: set 表達(dá)式 = CreateTrigger()其中表達(dá)式是 trigger 類型的變量新數(shù)據(jù)類型:trigger 類型: 是 handle 的子類型, 用于調(diào)用和處理觸發(fā)器b)觸發(fā)事件觸發(fā)事件的數(shù)據(jù)類型為 event(事件). 可以引起觸發(fā)響應(yīng)的觸發(fā)器必須先在于監(jiān)視事件發(fā)生.中觸發(fā)事件, 用觸發(fā)事件的函數(shù)在 common.j 中的native TriggerRegister*Event takes:trigger whichTrigger

53、, . returns event函數(shù)名:根據(jù)事件對(duì)象的不同, 有不同的事件響應(yīng). TriggerRegister*Event 中的* 號(hào)為對(duì)象名, 如:TriggerRegisterUnitEvent, TriggerRegisterEnterRegion 等,不同對(duì)象的事件要求傳遞相應(yīng)指定對(duì)象作為參數(shù), 有些事件要求傳遞下面所說(shuō)的過(guò)濾器(Filters)參數(shù):trigger whichTrigger /觸發(fā)器變量. /相應(yīng)指定對(duì)象的變量返回:event /返回該事件使用方法(舉事件的例子):call TriggerRegisterUnitEvent(哪個(gè)觸發(fā)器, 哪個(gè)新數(shù)據(jù)類型:event

54、 /事件c)觸發(fā)條件, 哪種類型的事件)觸發(fā)條件是一組表達(dá)式(boolexpr)數(shù)據(jù), 它的數(shù)據(jù)類型為條件函數(shù)(conditionfunc), 是表達(dá)式(boolexpr)類型的子類型.建立觸發(fā)條件的函數(shù)在 common.j 中的:native Condition takes code func returns conditionfunc參數(shù):code func /函數(shù)代碼作為參數(shù)返回:conditionfunc /返回建立的條件其中 takes code func 是指需要函數(shù)代碼 func 作為參數(shù), 參數(shù)函數(shù) func 必須的格式必須是:takes nothing returns. 即是

55、說(shuō), 用作參數(shù)的函數(shù)本身應(yīng)該是無(wú)參數(shù)且返回值為型().使用格式: set 表達(dá)式 =Condition(function型函數(shù)名)其中表達(dá)式是條件函數(shù)(conditionfunc)新數(shù)據(jù)類型:boolexpr表達(dá)式conditionfunc 條件函數(shù), 是表達(dá)式的子類型比如:function Girl1 takes nothing returns.return true endfunctionfunction Girl2 takes.return true endfunctioneger i returnsfunction Girl3 takes nothing returns nothing

56、.return endfunction/ 假設(shè) c 為 conditionfunc 類型變量set c = Condition(function Girl1) /(A)set c = Condition(function Girl2) /(B) 本身要求參數(shù)set c = Condition(function Girl3) /(C) 返回值不是類型Condiction() 中的參數(shù)函數(shù) code類型, 所以(B)(C)函數(shù)不可作為解釋: Girl1() 是無(wú)參數(shù)且返回為的函數(shù), 可以用作func. 而 Girl2() - 本身要求參數(shù), Girl3() - 返回值不是Condiction()的

57、參數(shù).在第一章變量篇中我沒(méi)有詳細(xì)說(shuō)明 code 類型的數(shù)據(jù), 因?yàn)榕伦x者不能理解. 現(xiàn)在我說(shuō)明下 code 類型數(shù)據(jù).用例子說(shuō)明, 比如:call myfuction1(IsGirl() /(A)call myfuction2(function IsGirl() /(B)(A) 和 (B) 之間 不同呢? 按理解: (A)(B) 都把 IsGirl() 運(yùn)行返回后的值當(dāng)作 myfunction1()/myfunction2()的參數(shù). IsGirl()在(A)中是的處理過(guò)程. 而(B)是創(chuàng)建了一個(gè)運(yùn)行IsGirl()邏輯的監(jiān)視線程, 只要線程沒(méi)給清除/終止, IsGirl()將一直監(jiān)視變化.

58、注意這里所說(shuō)的線程跟下面的 AI 線程是兩碼事.d) 增加觸發(fā)條件:觸發(fā)條件可以用 TriggerAddCondition()增加增加觸發(fā)條件的函數(shù)在 common.j 中的:native TriggerAddCondition takes trigger whichTrigger, boolexpr condition returns triggercondition參數(shù):trigger whichTrigger /觸發(fā)器變量 boolexpr condition /觸發(fā)條件變量返回:triggercondition /返回該觸發(fā)條件的 handle(句柄)使用格式:set tc = Tri

59、ggerAddCondition(觸發(fā)器, 觸發(fā)條件)其中 tc 為 triggercondition 類型變量新數(shù)據(jù)類型:triggercondition 觸發(fā)條件句柄(注意: 觸發(fā)條件和上面例:的觸發(fā)事件是不一樣的!)這是增加/移除/改變觸發(fā)條件的例子/文件頭 globals.個(gè)全局變量 tctriggercondition tc = null trigger mytrigger = null.endglobalsfunction Girl takes nothing returns.return true endfunctionfunction notGirl takes nothing

60、 returns.return false endfunction/為 mytrigger 增加觸發(fā)條件function addcondition takes nothing returns nothing.set mytrigger = CreateTrigger()set tc = TriggerAddCondition(mytrigger, Condition(function Girl).endfunction/因?yàn)?tc 是 mytrigger 觸發(fā)條件的句柄, 把 tc 清空便清除了指向的觸發(fā)條件. function removecondition takes nothing re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論