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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、Greedwind 教學 Jass 基礎一這個假設你已經(jīng)比較熟練地使用 Trigger 并有一定的邏輯基礎和程序設計基礎, Knowning engish ispreferable首先問個問題: 為什么要學 JASS?先看下面的例子:以下例子可以實現(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)象以上例子, 如果不使用用局部變量, 將無法準確銷毀臨時漂浮文字. 因為在等待5秒后(-Wait 5.00 seconds), 最近創(chuàng)建的漂浮文字(last created floating text)可能已經(jīng)不是原來的那個了!)要達到目的, 必須對 JASS 有些了解.將對此 TRIGGER 作進一步的分析.jass 基礎學新的程序設計語言, 要先學它的變量類

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

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

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

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

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

8、寫區(qū)分的, 賦值時引號 handlehandle 句柄, 可以是 null(空值). 是用于指向 Warcraft III 定義的數(shù)據(jù)結(jié)構(gòu)的指針. 比如上表中的location/player 等除了codeeger/real/boean/string 外的的變量實際上就是 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) / 先運行someFunction也可以: call RunFunctionForAllPlayers(null) /不運行其他函數(shù)用戶定義變量類型正如上面所說, 上表中 location/player 等除了eger/real/boean/string 外的類型實際上就是handle 類型的子類型, 這些變量就是用戶類型變量, 實際就是一個數(shù)據(jù)結(jié)構(gòu)的指針.數(shù)組是指一組同類型的有序列的變量. 數(shù)組中包含的元素可以用n來指明(n 表示第 n + 1個元素, 從 0算起).以上所說的變量類型中除

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

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

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

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

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(有關在 Trigger EditUI)中使用局部變量?UI)中使用局部變量詳細方法請參看簽名中的- 3c 的內(nèi)存泄漏)GUI 中不能直接局部變量,但是可以使用全局變量作為中介首先定義變量類型。定義變量類型的語句只能放在 TIGGER 的開頭,不然會出現(xiàn)編譯錯誤定義變量類型:要用:Custom Script - Action語法:Custom Script: local 變量類型請參看 WORLD EDITOR 和 JASS 變量類型對應表例如:-變量Custom Script: locait u-組變量Custom Sc

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

17、seconds), 最近創(chuàng)建的漂浮文字(last created floating text)可能已經(jīng)不是原來的那個了 )例子: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_開頭的局部變量與已定義全局變量名字相同)該方法在觸發(fā)內(nèi)該類同名變量數(shù)量=2時會出現(xiàn)嚴重 Bug!jass

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

20、l 變量類型 變量名稱 = 初始值 /有初始化的局部變量 local 變量類型 變量名稱 /無初始化的局部變量local 變量類型 array 變量名稱 /數(shù)組局部變量, 不能再次初始化賦值注意:1) 不論是全局變量還是局部變量, 必須在程序開始部分首先即是全局變量總是在程序文件的最前端,而局部變量總是在函數(shù)的最前面.在 Trigger Editor 用變量管理器(Ctrl + B)中定義的變量都是全局變量在 Trigger Editor 的循環(huán) GUI 語句 For Loop (eger A)和 For Loop ( eger B)都是全局變量實例: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(有關在 Trigger EditUI)中使用局部變量?UI)中使用局部變量詳細方法請參看簽名中的- 3c 的內(nèi)存泄漏)GUI 中不能直接局部變量,但是可以使用全局變量作為中介首先定義變量類型。定義變量類型的語句只能放在 TIGGER 的開頭,不然會出現(xiàn)編譯錯誤定義變量類型:要用:Custom Script - Action語法:Custom Script: local 變量類型請參看 WORLD EDITOR 和 JASS 變量類型對應表例如:-變量Custom Script: locait u-組變量Custom Script: local group g然后將它

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

24、t created floating text)可能已經(jīng)不是原來的那個了 )例子: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_開頭的局部變量與已定義全局變量名字相同)該方法在觸發(fā)內(nèi)該類同名變量數(shù)量=2時會出現(xiàn)嚴重 Bug!jass 基礎之四函數(shù)篇如果你仔細讀完并讀懂前面兩章,

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

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

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

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

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

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

33、ASS 變量類型對照表: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 位置(點) null R

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

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

36、rigger Jass 中經(jīng)常調(diào)用的庫函數(shù)/全局變量, 實際上是基于 common.j 寫的子函數(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 打開 war3patpq, 在 WPQ 右上方的輸入框中輸入: scripts* ,如果你的war3patpq 沒有加密過, 那么可以找到這3個文件. 如果是加密過的, 則需要把 war3patpq 的文件全部解壓到臨時目錄, 然后用 Ultra-Edit 中的在文件中搜索字符的功能尋找這3個文件.4) 可以在自己的地圖中使用自定義的 common.j, Blizzard.j, common.ai 嗎?可以. 用輸入管理器輸入自定義的 common.j, Blizzard.j, common.ai, 輸入目錄應為scripts. 這樣,

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

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 之間的聲明)來看, 這個函數(shù)需要輸入玩家,編碼, 坐標 x, 坐標 y, 方向角度, 返回值是類型變量.從函數(shù)的名字和參數(shù)表, 可以猜測/確認 CreateUnit()是用來在地圖的 x/y 坐標中為指定玩家創(chuàng)建指定, 并且使創(chuàng)建面向所定義的角度, 返回值是創(chuàng)建.在地圖函數(shù) main()中,

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

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

42、面, main() 是地圖函數(shù), 在 main() 調(diào)用了一些再現(xiàn)地圖設計時原貌的子函數(shù)如CreateAlits(). 因此,可以在 CreateAlits()中加入隨機函數(shù) GetRandom()來控制/物品/可破壞物等初始化過程.可以用 Wwar3map.j 后, 再用WPQ 打開要修改的地圖, 提取 war3map.j 來修改 main()函數(shù)及其相關函數(shù). 修改完PQ 導入修改后的 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()也不是庫函數(shù), 是用戶自定義函數(shù)):可以根據(jù) CreateAlits()創(chuàng)建另一個函數(shù):function CreateAlitsRandom takes nothing re

44、turns nothing/ random是 1,2,3中的隨機數(shù)localeger random= GetRandom(1, 3)call CreateNeutralPassiveBuildingsRandom(random)call CreatePlayerBuildingsRandom(random call CreateNeutralHostileRandom(randomcall CreateNeutralPassiveRandom(random)call CreatePlayerUnitsRandom(randomendfunction)因為原來調(diào)用的函數(shù)都是無參數(shù)函數(shù), 所以相應

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

46、glocal play= PlayLAYER_NEUTRAL_AGGRESSIVE)localocalit ueger unitIDlocal trigger t local real life/加入條件控制, 根據(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) 初始設置方法:問題的關鍵就是, 這么多初始, 怎么樣修改起來不累人?這里介紹法:先把要修改的地圖修改地圖初始的類型/位置/寶物等, 刪除所有 TRIGGER, 并保存地圖, 提取 war3map.j3

49、. 用W 4.5. 把PQ 打開war3map.j 中對應函數(shù)中創(chuàng)建的語句的語句粘貼在原地圖中相應函數(shù)的適當位置6. 重復1-5,的隨機初始化設置注意: 如果用 World Editor 再次修改并保存, main()將使用 GUI 默認生成的 call CreateAlits(),而不是 call CreateAlitsRandom(). 此時還需要打開 war3map.j 修改 main()函數(shù).同樣, 使可破壞物等初始設置有隨化也可以用此方法.jass 基礎之五庫函數(shù)這章是 Jass 基礎中最難的部分, 也是最實用的部分.Jass 的關鍵字有26個, 跟英文字母一樣多.來回顧一下: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以此看來, Jass 是語法結(jié)構(gòu)最簡單的一種準計算機語言. Jass 實現(xiàn)功能基本依靠調(diào)用 common.j, blizzad.j, common.ai 中的庫函數(shù).本章所述內(nèi)容不屬于 Jass 語法部分, 最主要講述

51、:觸發(fā)器(Triggers)跨通訊(er-Script Communication)隊列(Enumerations)隊列過濾器(Filters)線程(Threads)1) 觸發(fā)器(Triggers)觸發(fā)器用于地圖觸發(fā)器(Trigger Jass), 用于響應特定事件. 它是種響應信號(callback), 觸發(fā)器不能應用于 AI, 即是說 AI Jass 中不能有觸發(fā)器的語句.觸發(fā)器包含創(chuàng)建觸發(fā)器, 設置觸發(fā)條件, 設置動作. 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 /無參數(shù)返回:trigger /返回創(chuàng)建的觸發(fā)器使用格式: set 表達式 = CreateTrigger()其中表達式是 trigger 類型的變量新數(shù)據(jù)類型:trigger 類型: 是 handle 的子類型, 用于調(diào)用和處理觸發(fā)器b)觸發(fā)事件觸發(fā)事件的數(shù)據(jù)類型為 event(事件). 可以引起觸發(fā)響應的觸發(fā)器必須先在于監(jiān)視事件發(fā)生.中觸發(fā)事件, 用觸發(fā)事件的函數(shù)在 common.j 中的native TriggerRegister*Event takes:trigger whichTrigger

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

54、 /事件c)觸發(fā)條件, 哪種類型的事件)觸發(fā)條件是一組表達式(boolexpr)數(shù)據(jù), 它的數(shù)據(jù)類型為條件函數(shù)(conditionfunc), 是表達式(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、說, 用作參數(shù)的函數(shù)本身應該是無參數(shù)且返回值為型().使用格式: set 表達式 =Condition(function型函數(shù)名)其中表達式是條件函數(shù)(conditionfunc)新數(shù)據(jù)類型:boolexpr表達式conditionfunc 條件函數(shù), 是表達式的子類型比如:function Girl1 takes nothing returns.return true endfunctionfunction Girl2 takes.return true endfunctioneger i returnsfunction Girl3 takes nothing returns nothing

56、.return endfunction/ 假設 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() 是無參數(shù)且返回為的函數(shù), 可以用作func. 而 Girl2() - 本身要求參數(shù), Girl3() - 返回值不是Condiction()的

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

58、注意這里所說的線程跟下面的 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.個全局變量 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/因為 tc 是 mytrigger 觸發(fā)條件的句柄, 把 tc 清空便清除了指向的觸發(fā)條件. function removecondition takes nothing re

溫馨提示

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

評論

0/150

提交評論