好亞論壇上search下“jass”,能看到不少好文章。
[圖文][WE JASS] 《jass使用教程·基礎(chǔ)篇》
前言 jass語(yǔ)言概述
0. 教程對(duì)象
本教程適用于沒(méi)有接觸過(guò)計(jì)算機(jī)語(yǔ)言的人。由于jass非常簡(jiǎn)單,所以對(duì)學(xué)過(guò)一種中高級(jí)語(yǔ)言的人完全沒(méi)有難度,而本教程對(duì)j語(yǔ)言的各部分都介紹的比較詳細(xì),
所以沒(méi)有必要學(xué)。如果只會(huì)用行號(hào)的basic(不包括vb、vbscript、ASP)的話,那還是看看這篇教程吧(不過(guò)可以略過(guò)很多部分)。
如果是完全沒(méi)有接觸過(guò)編程的話,建議第一遍通讀,大體掌握jass語(yǔ)言的結(jié)構(gòu),然后再由基礎(chǔ)到高級(jí)一步步的提高。
基礎(chǔ)篇是對(duì)于語(yǔ)言的基本結(jié)構(gòu)的介紹,首先要掌握好里面的關(guān)鍵部分,打好這個(gè)基礎(chǔ)后,可以跟隨高級(jí)篇里面的范例一步步的學(xué)jass的應(yīng)用。
1. jass的特點(diǎn)
jass語(yǔ)言是一個(gè)語(yǔ)法非常簡(jiǎn)單的語(yǔ)言,語(yǔ)法結(jié)構(gòu)上比較接近basic,同時(shí)也引用了許多c的東西。
2. 如何學(xué)習(xí)和使用jass
在trigger editor窗口中,我們可以很容易的把一個(gè)t轉(zhuǎn)成j,方法是Edit(alt+e)->Conver to Custom Text(x),然后我們就可以在已有的j的基礎(chǔ)上進(jìn)行編輯。
由于we里的文本編輯器功能不夠豐富,另外,we的容錯(cuò)機(jī)制比較差(j的錯(cuò)誤太多容易導(dǎo)致直接關(guān)閉),所以這里推薦兩個(gè)專(zhuān)門(mén)用于jass編輯的工具:
jass editor(漢化版)和jass workshop(by soarchin)。兩個(gè)工具各有各的特點(diǎn),后面會(huì)在涉及到的部分提到。
另外還需要得到cj和bj兩個(gè)接口函數(shù)庫(kù),這個(gè)在je和jw中均有提供
3. jass和trigger的關(guān)系
在地圖編輯過(guò)程中,絕大多數(shù)用j能夠完成的東西也能夠用t來(lái)完成。事實(shí)上,所有的t最后都會(huì)轉(zhuǎn)化成j,trigger只是面向we的獨(dú)特體系。具體的說(shuō),
war3提供的API有common.j和blizzad.j兩個(gè)文件,其中c.j是純粹的接口,而blz.j是對(duì)cj里面接口函數(shù)的封裝,主要面向
trigger editor,t生成的j代碼中,絕大多數(shù)函數(shù)都是bj里的。
4. 為什么要學(xué)習(xí)j
a.用heavylock等工具壓縮后,trigger和j面向we的部分被刪除了,只留下script.j里面干凈的j部分,為了研究別人的map,就要能讀懂別人的代碼;
b.t雖然能完成幾乎所有的功能,但是對(duì)于內(nèi)存釋放和另外一些功能實(shí)現(xiàn)的能力太差;
c.雖然t看似是一個(gè)語(yǔ)法結(jié)構(gòu)完整的可讀性比較高的語(yǔ)句,但是因?yàn)槌3UZ(yǔ)句太長(zhǎng)導(dǎo)致可讀性大大下降,而j可以更方便的體現(xiàn)邏輯性,事實(shí)上j的可讀性更強(qiáng);
d.用j可以寫(xiě)出比t效率高很多的代碼,當(dāng)然這是在對(duì)計(jì)算機(jī)工作原理比較了解的前提下。
=================================================
第一章 jass基礎(chǔ)
0. 本章概述
本章介紹jass語(yǔ)言的最基本內(nèi)容,包括注釋、基本數(shù)據(jù)類(lèi)型、變量、數(shù)組、基本運(yùn)算符、運(yùn)算的優(yōu)先級(jí)、常量、基本運(yùn)算法則
首先在這里說(shuō)明一點(diǎn),jass是區(qū)分大小寫(xiě)的,也就是說(shuō),jass不會(huì)認(rèn)為“a”和“A”是同一種東西
-----------------------------------------
1. 注釋?zhuān)╟omment)
注釋符號(hào)://
不論是we的語(yǔ)法檢查器還是war3,“//”之后該行的內(nèi)容將被忽略
-----------------------------------------
2. 數(shù)據(jù)類(lèi)型:
jass雖然不大,但是提供的功能足夠豐富,共提供了6種基本數(shù)據(jù)類(lèi)型:
1) integer : 32位有符號(hào)整數(shù)型(4byte) 取值范圍:[-2147483648, 2147483647] (2^31+符號(hào)位)
2) real : 實(shí)數(shù)型(單精度浮點(diǎn)型,4byte) 取值范圍:[1.5*10^(-45), 3.4*10^38]
3) boolean : 布爾型(1byte) 記錄 true(真)或 false(假)
4) string : 字符串型(不定長(zhǎng)) 用來(lái)記錄字符
5) handle : 數(shù)據(jù)指針型 是jass語(yǔ)法的一個(gè)基礎(chǔ)類(lèi)型,相當(dāng)于passcal中的pointer類(lèi)型,由它可以派生出其他數(shù)據(jù)類(lèi)型的指針。用來(lái)指向內(nèi)存中的一個(gè)數(shù)據(jù)地址
6) code : 函數(shù)指針型 用于指向內(nèi)存中的函數(shù)地址
* 其他數(shù)據(jù)類(lèi)型: 1.16有81種,1.17又新增5種,都是由繼承handle而來(lái),在common.j最開(kāi)始的部分,
聲明形式如下:
type ****** extends handle //此處即使不是handle,也是其他由handle繼承而來(lái)的類(lèi)型
-----------------------------------------
3. 變量:
知道了jass的基礎(chǔ)數(shù)據(jù)類(lèi)型,下面我們要了解如何使用這些數(shù)據(jù)。首先就是要對(duì)數(shù)據(jù)進(jìn)行存取,基本的辦法就是使用變量。什么是變量呢?就是war3在運(yùn)行的時(shí)候在內(nèi)存中申請(qǐng)一塊數(shù)據(jù)空間,用來(lái)存取數(shù)據(jù)的。
1) 變量的類(lèi)型:分全局變量和局域變量?jī)煞N,在j中最常用的是局域變量
2) 變量的命名:
首先要給變量一個(gè)獨(dú)特名字,作為這個(gè)變量的標(biāo)志,以便在以后的使用過(guò)程中訪問(wèn)。
變量名稱(chēng)必須以英文字母開(kāi)頭,變量名中可以包括:大小寫(xiě)英文字母(A~Z, a~z)、數(shù)字(0~9)、下劃線(_),其它符號(hào)會(huì)被認(rèn)為非法(不要用中文命名變量名)。
we會(huì)自動(dòng)給全局變量加上“udg_”前綴,在jass中使用全局變量的時(shí)候直接手動(dòng)輸入“udg_”前綴即可訪問(wèn)全局變量。
第二章 jass語(yǔ)法結(jié)構(gòu)
0. 本章概述
本章介紹jass語(yǔ)言的基本語(yǔ)句,包括判斷、循環(huán)、判斷和循環(huán)的嵌套、數(shù)組-----------------------------------------1. jass的判斷語(yǔ)句
與大多數(shù)的語(yǔ)言一樣,jass使用了if作為判斷語(yǔ)句。jass的if與passcal的判斷語(yǔ)法相似(這里不得不b4 basic一下,賦值與判斷相等居然都使用“=”,否則的話這里把basic也加進(jìn)去了)。語(yǔ)法:
a)
if 判斷式 then
...
<else
...>
endif 當(dāng) 判斷式 的值為 true 的時(shí)候,執(zhí)行語(yǔ)句
若出現(xiàn)else,則為當(dāng) 判斷式 的值為 true 則執(zhí)行到 else 之前的語(yǔ)句,否則的話,執(zhí)行 else 到 endif 之間的語(yǔ)句
if 判斷式 then
...
elseif 判斷式 then
...
elseif 判斷式 then
...
<else
...>
endif 實(shí)現(xiàn)多重判斷,不做更多的解釋了。
-----------------------------------------2. jass的循環(huán)語(yǔ)句
一般的語(yǔ)言會(huì)提供for循環(huán)和loop循環(huán)兩種循環(huán),另外還有結(jié)構(gòu)化語(yǔ)言中不提倡使用的goto這個(gè)轉(zhuǎn)向語(yǔ)句。for循環(huán)實(shí)際上是一種最簡(jiǎn)單情況的
loop循環(huán),而靠goto控制的轉(zhuǎn)向可以用loop來(lái)完成。遺憾的是jass沒(méi)有提供另外兩個(gè)循環(huán)中非常方便的關(guān)鍵字continue和break,不
過(guò)靠if和exitwhen也可以完成的。語(yǔ)法:
loop
...
exitwhen 表達(dá)式
...
<exitwhen 表達(dá)式>
...
endloop
當(dāng)表達(dá)式的值為true的時(shí)候,退出該循環(huán)。需要說(shuō)明的是,可以有不止一個(gè)exitwhen,并且exitwhen可以在loop中的任意位置。在使用循
環(huán)的時(shí)候,要注意避免死循環(huán)。所謂死循環(huán),就是一直循環(huán)下去不會(huì)滿足退出的條件,這在使用loop循環(huán)的過(guò)程中非常常見(jiàn),例如: set i=1
loop
exitwhen i>5
... //中間忘記了set i=i+1
endloop war3有針對(duì)死循環(huán)的容錯(cuò)機(jī)制,當(dāng)達(dá)到一定循環(huán)次數(shù)的時(shí)候會(huì)自動(dòng)退出function,也就是說(shuō)endloop后的語(yǔ)句不會(huì)被執(zhí)行。
-----------------------------------------3. 判斷與循環(huán)的嵌套
往往一個(gè)判斷或者一次循環(huán)不能夠滿足我們想要做的事情,這個(gè)時(shí)候就涉及到了嵌套。嵌套不難理解,就是在一個(gè)判斷或循環(huán)中,使用了另外一個(gè)判斷或循環(huán),如: loop
...
if ... then
loop
...
endloop
else
if ... then
...
endif
endif
...
loop
...
endloop
endloop 為什么要把嵌套單獨(dú)拿出來(lái)講一節(jié),就是因?yàn)閷?duì)初學(xué)編程的人來(lái)說(shuō),使用嵌套的時(shí)候常常會(huì)出現(xiàn)一些錯(cuò)誤。一旦出現(xiàn)了嵌套,一定要先結(jié)束里層,然后再結(jié)束外層,如下面的語(yǔ)法是不正確的: loop
if ... then
...
endloop
...
endif 可能看到我前面寫(xiě)的東西,各位也比較喜歡空格了吧。在循環(huán)和判斷的時(shí)候用空格來(lái)縮進(jìn),這樣能夠更直觀的現(xiàn)實(shí)邏輯關(guān)系,使代碼的可讀性大大加強(qiáng)。但是縮進(jìn)也可能導(dǎo)致一些主觀的判斷錯(cuò)誤,例如: if ... then
...
if .... then
...
else
...
endif
在儲(chǔ)存的時(shí)候這段代碼會(huì)報(bào)錯(cuò)。問(wèn)題比較容易,自己看吧(j需要endif的語(yǔ)法結(jié)構(gòu)事實(shí)上能夠比較好的避免大多數(shù)問(wèn)題,像在c里面考試還會(huì)常常出這類(lèi)的題
hoho)。-----------------------------------------4. 數(shù)組的使用
有些時(shí)候,你會(huì)不會(huì)覺(jué)得一些重復(fù)的操作很煩呢?比如把一個(gè)單位身上的物品丟在一個(gè)地方,過(guò)一段時(shí)間之后再放回身上,例如: local unit u = GetTriggerUnit()
local item item1 = UnitItemInSlotBJ(u, 1)
local item item2 = UnitItemInSlotBJ(u, 2)
local item item3 = UnitItemInSlotBJ(u, 3)
local item item4 = UnitItemInSlotBJ(u, 4)
local item item5 = UnitItemInSlotBJ(u, 5)
local item item6 = UnitItemInSlotBJ(u, 6)
... 這種時(shí)候,我們可以用一個(gè)array(數(shù)組)來(lái)表示一組東西。1) 數(shù)組的聲明:
數(shù)組也是變量,所以也有全局和局域之分。全局的數(shù)組只要在全局變量的設(shè)置中,把a(bǔ)rray勾上就可以了,實(shí)際上是在變量的聲明過(guò)程中,在變量類(lèi)型和變量名
稱(chēng)之間加入array關(guān)鍵字: local item array items*
補(bǔ)充:在全局變量的聲明中,還有個(gè)size選項(xiàng),那個(gè)選項(xiàng)實(shí)際上是假的,只是你自己輸入一個(gè)數(shù)字提示自己這個(gè)數(shù)組應(yīng)該有多大而以。jass為了防止
mapper不熟練使用數(shù)組產(chǎn)生的bug,采用了自動(dòng)增加數(shù)組長(zhǎng)度的方式。2) 數(shù)組的引用:
使用方括號(hào)“[]”作為數(shù)組的索引,如訪問(wèn)index=1的變量 set item[1] = CreateItem(...) 數(shù)組索引的最低值為0,最高值俺沒(méi)測(cè)試過(guò),不過(guò)估計(jì)沒(méi)誰(shuí)那么瘋狂,不斷的往數(shù)組里面添東西。
結(jié)合if判斷和loop循環(huán),數(shù)組可以減少我們大量的重復(fù)工作。------------
posted on 2008-04-08 04:26
七星重劍 閱讀(1022)
評(píng)論(3) 編輯 收藏 引用 所屬分類(lèi):
亂七八糟