聲明:有壹定T基礎的人,基本可以在10分鐘內掌握jass教程,夯實基礎後還要繼續深入。
學習和研究,請到高層論壇了解相關信息。摒棄傳統教學的特點,開門見山,深入淺出的講解,
即使是沒有程序基礎的人,也能在短時間內快速掌握。本教程不打算鏈接到其他語言。
不管什麽原因,基於讓人們快速掌握和理解語言的初衷,采用了最有效、最受歡迎的手。
方法來解釋語言。關於jass是什麽,為什麽要研究它,我就不贅述了。
——————————————————————————————————
首先,我第壹次見到jass
1,概述(5秒)
至於jass,妳只需要知道兩件事:變量和函數。
╔═══╦════════════════════════╗
║變量║存儲數據,並著重了解和掌握全局和局部變量║.
╠═══╬════════════════════════╣
║function║║║║║║║║║║║║║║║║║║║║║║║ιιιιιι9
╚═══╩════════════════════════╝
2.詳細解釋(2分20秒)
(1),變量和函數以下列格式聲明:
———————————————————————————
A.全局變量的聲明:
全局
變量類型變量名(=初始值)//括號表示不需要賦值,下同。
變量類型數組數組名//array不能直接賦值,需要在函數中逐個賦值。
結束全局
b .函數和局部變量的聲明:
函數函數名帶參數列表返回返回值類型
局部變量類型變量名(=初始值)
......
執行語句
......
返回返回值
結束函數
———————————————————————————
(2)、全局變量和局部變量的區別:
任何全局函數都可以使用,局部函數只作用於聲明的函數。不同函數的局部變量可以同名,最好不要命名為全局和。
參數名稱相同。全局內存占用大,執行速度快,全局內存占用則相反。在觸發器中,諸如觸發器單元、循環整數a、
最後創建的公司和新公司組是全局變量。同樣,變量編輯器(ctrl+B)中的變量也是全局變量。
(3)、功能,掌握以下要點:
(1)函數名是唯壹的;
(2)函數可以沒有參數和返回值,是空函數;
③參數表為參數類型1,參數名稱1,參數類型2,參數名稱2,...,參數類型n和參數名稱n..逗號分隔就夠了;
④返回值必須唯壹;
(5)、局部變量聲明必須在所有執行語句之前;
6.return必須寫在函數的末尾,也就是endfunction上的那壹行;
⑦如果沒有返回值函數,就不用寫return;
8.註意return和return的區別以及它們攜帶的數據。前者後面是變量類型,後者後面是具體數據;
⑨,數組不能做參數和返回值。
示例:
———————————————————————————
全局
Integer int = 3 //聲明壹個整數全局變量int,賦給3。
Real col //聲明壹個實全局變量col未賦值。
字符串數組str //聲明壹個字符串數組str。
布爾數組b = false //錯誤!數組不能直接賦值!
結束全局
局部整數索引= 19 //錯誤!局部變量聲明如何脫離函數?
函數A不取任何值,也不返回任何值
局部整數a = 1 //聲明壹個整數局部變量A,賦給1,下同。
局部整數b = 2
局部整數c = a + b
Call BJDebugMsg(I2S(c)) //顯示c的值,這句話(帶Call)就是執行語句。
結束函數
函數B取實數r,整數e不返回任何值
//接受實數參數r和整數參數e。
調用bjdebugmsg(r2s(r)+i2s(e))//顯示r的值
結束函數
函數C不取任何值,返回實數
//返回壹個實變量。
Return 2 * 3 * 15 //正確,必須有返回值。
結束函數
函數D不取任何值,返回實數,整數
//這個函數是錯的!壹個函數只能返回壹種數據類型!
返回...
結束函數
函數E取實數r返回實數
//這個函數是錯的!有返回值類型,但是函數末尾沒有具體的返回值!
結束函數
函數F取實數r返回實數
//正確,有返回值類型和具體返回值。
返回r * 33
結束函數
函數G不取任何值,不返回任何值
致電BJDebugMsg(I2S(h))
//錯誤!局部變量聲明必須在所有執行語句之前!
局部整數h = 5
結束函數
函數H接受整數數組num,不返回任何值
//錯誤!數組不能用作函數的參數!
結束函數
———————————————————————————
二、jass進階(1分30秒)
(1),函數定義
很多剛接觸jass的朋友都沒搞清楚這個問題。簡單來說,職能就是能夠獨立完成某項工作的機構。
以函數showtext為例。他能做什麽?或者他有什麽樣的功能?註意,函數中的所有內容
(function~endfunction)之間的部分就是這個函數的函數或函數。所以,這個函數的功能是
打印壹行信息“我在學jass”。
———————————————————————————
函數showtext不帶任何內容,不返回任何內容
調用BJDebugMsg("我在學jass") //顯示"我在學jass "
結束函數
———————————————————————————
(二)、生成和操作
函數是如何運行(調用)的?很簡單,調用函數的名字(參數表)就夠了,這裏的參數表的要求前面已經提到了。
我做到了。需要註意的是,call後面是某個函數,這個函數叫做被調用函數。被調用的函數必須在調用
函數,且傳遞狀態下的參數列表應與被調用函數的參數列表的類型、順序和數量壹致。
———————————————————————————
函數A接受整數I,不返回任何值
調用BJDebugMsg(i2s(I))//Display 31。
結束函數
函數B不取任何值,也不返回任何值
調用A(31) //正確,被調用的函數A在函數b的前面,函數b將整數31傳遞給函數A。
調用C(0.02) //錯誤!被調用的函數c在函數b後面!
結束函數
函數C不返回任何值
調用BJDebugMsg(R2S(r))
結束函數
———————————————————————————
可以讓壹個函數調用後面的函數嗎?是的。使用ExecuteFunc("函數名")的搜索函數,但要註意兩點:
①函數檢索距離不能太大,即兩個函數之間的字節碼有限;
②在檢索狀態下,被調用的函數不能有參數,但可以有返回值;
③在遵循②的前提下,被搜索的函數既可以在被搜索的函數之前,也可以在被搜索的函數之後。
———————————————————————————
函數A不取任何值,也不返回任何值
結束函數
函數B不取任何值,也不返回任何值
調用ExecuteFunc("A") //正確,檢索到的函數沒有參數,下同。
調用ExecuteFunc("C ")
調用ExecuteFunc("D") //錯誤!被檢索的函數d帶有參數!
結束函數
函數C不帶任何內容,返回整數
返回256
結束函數
函數D接受整數I,不返回任何值
致電BJDebugMsg(I2S(壹))
結束函數
———————————————————————————
三、語法(1分30秒)
(1),循環
——————————————————
環
exit when condition//滿足條件退出循環。
執行語句
末端回路
——————————————————
(2)條件控制
——————————————————————
壹、單層控制:
If條件then //如果滿足條件1,則執行該操作。...
執行語句
endif
b、雙重控制:
如果條件1,則//如果滿足條件1,則執行該操作。...
執行語句
否則,就去做。...
執行語句
endif
c、多層控制:
如果條件1,則//如果滿足條件1,則執行該操作。...
執行語句
else if condition 2 then//Do it if condition 2。...
執行語句
Elseif condition 3 then //如果滿足條件3,則執行它。...
執行語句
else if condition 4 then//Do it if condition 4。...
執行語句
.....//滿足條件n就做。...
endif
——————————————————————
(3)、邏輯關系:
只有三個,and(和),or(或),not(非)。
(4)、比較和運算符:
只有9,[](數組),[] =(數組賦值),=(賦值),
= =(等於),!=(不等於),>(大於),
& gt=(大於或等於),< =(小於或等於)
(5)、舉例。如果混合使用,請註意嵌套:先結束內層,再結束外層:
———————————————————————————
函數A接受整數I,整數j不返回任何值
If (i==3,j==5) then //如果滿足i=3,j=5,則顯示它們的和。
呼叫BJDebugMsg(I2S(i+j))
其他
調用BJDebugMsg(“條件不符!”)//否則不要給出“條件不符”的警告!
endif
結束函數
函數B不取任何值,也不返回任何值
局部整數i = 1
局部整數數組索引
環
exitwhen i & gt7 //當我& gt7點退出循環
設置索引= 25 * i
集合i = i + 1
末端回路
結束函數
函數C不帶任何內容,返回整數
局部整數i = 1
局部整數數組索引
環
exitwhen i & gt七
設置索引= 25 * i
如果(i==2或i==6)那麽
致電BJDebugMsg(I2S(壹))
Endif //endif嵌套在壹個循環內,所以應該先結束內層。
集合i = i + 1
Endloop //再次結束外層
結束函數
———————————————————————————
四、功能間的數據傳遞(4分)
(1),使用全局數組傳輸
這涉及到很多內容,暫時不做解釋。
(2)、1.20 Gamechche(遊戲緩存)+返回Bug(類型強制轉換)
眾所周知,為了實現多技能操作,可以使用全局數組。當然,可以使用局部變量,因為局部變量
它們互不幹擾、穩定且並行運行。當然,我們可以通過傳遞參數來傳遞局部變量的值。然而,
對於壹些不允許帶參數的函數,局部變量的數據不能在函數之間傳遞。我該怎麽辦?妳需要在這個時候使用它
到緩存。有哪些函數不允許這樣的參數?綜上所述:如下
1,jass定時器調用的函數;
2.隊列事件(單位組、玩家組、可破壞組等)的過濾(條件)功能。);
3.觸發器的條件函數。
Cache很好理解,只是壹個倉庫。這個倉庫可以想象成壹個有很多櫃子的大房子,每個櫃子
裏面有很多抽屜,但是,每個抽屜只能裝指定的五類東西,每個東西只能裝壹個。
這就是櫥櫃的原理,不需要抽象的技術術語。我想上面的解釋已經讓妳明白什麽是緩存了。
那麽,在實際的緩存中,房子可以算是壹個緩存。當然,既然是大房子,地圖和緩存就夠了。
櫃子可以看作是緩存的目錄,抽屜可以看作是緩存的標簽,因為緩存的目錄和標簽都是字符串的形式,因為
在這裏,我們不妨把壹個打火機1存放在房子X的櫃子A和抽屜K:房子X →櫃子A →抽屜K →打字。
打火機1同樣,我們必須在存儲後的指定路徑下找到這個打火機1。基於抽屜中存放物品的獨特性,“房間”
子X →櫃A →抽屜K”指的是存放的打火機1。因為抽屜壹次只能放壹樣東西,如果再放,
如果壹個打火機2進去,會覆蓋前面的打火機1。這時“房子X →櫃子A →抽屜K”指向命中。
打火機2。當然,如果妳把打火機2放在其他抽屜裏,比如抽屜L,完全不會影響打火機1的收納,因為有兩個不相幹的。
小路。
所以對於緩存來說,壹個標簽只能存儲五種類型的數據是壹個道理:整數、實數、布爾值、字符串、單位。每種數據
只能保存壹個,否則傳入的數據會覆蓋以前屬於該類別的數據。讓我們看看緩存是如何實現的。註意,緩存
它必須在使用前初始化。方法是set cache變量名= InitGameCache(“緩存名”),緩存名隨便妳。
Fetch:調用存儲數據類型(緩存、目錄名、標簽名、這類數據的某個值)。
Storage: GetStored數據類型(緩存、目錄名、標記名)
清除標簽:調用FlushStored數據類型(緩存、目錄名、標簽名)
清除目錄:調用FlushStoredMission(緩存,目錄名)
清空整個緩存:調用FlushGameCache。
檢測緩存數據是否存在:具有存儲的數據類型(緩存、目錄名、標記名)。
假設緩存名是udg _ GC(udg _是什麽?有t基礎的知道多少):
調用Store Integer (UDG _ GC," A "," B ",15)//將B標簽下的整數15存儲在緩存GC的A目錄下。
調用Store Real (UDG _ GC,“A”,“B”,0.2)//將B標簽下的實數0.2存儲在緩存GC的A目錄下。
調用Storei Boolran (udg _ GC," A "," B ",false)//將B標簽下的布爾值false保存在緩存GC的A目錄下。
調用StoreString (udg _ GC," A "," B "," TigerCN ")//將字符串Tiger CN保存在緩存GC的A目錄下的B標簽下。
因為每壹種數據都可以存放在同壹個路徑下,所以不會有沖突,但是如果此時這個數據下存放了壹個整數37,也就是說,
調用StoreInteger(udg_GC," A "," b ",37)
然後getstoreiminator(udg _ GC,“a”,“b”)指向後面存儲的37,但這並不影響該路徑下的其他類型數據。
除非他們想這樣改變。當然,為了保證整數15不被覆蓋,我們可以在標簽C下保存37,即:
調用StoreInteger(udg_GC," A "," c ",37)
使用循環+緩存,我們可以訪問局部數組變量。
這時候有的同學會問:只能訪問5種嗎?太少了!如果我想訪問壹個特殊效果呢?別擔心,返回bug已經出來了!我們能
為了用他把其他句柄類的數據轉換成整數,然後用StoreInteger來存儲。返回bug的原理很簡單,使用編譯器
自下而上的檢測,遇到第壹次退貨,如果被虛假結果蒙蔽,會自動跳過檢測。其形式如下:
———————————————————————————
函數H2I接受句柄hreturns整數
返回h //真正返回的值是h,是句柄指向的內存地址。
Return 0 //編譯器先檢查這裏,返回值為0,是正確的。跳過檢查。
結束函數
函數I2E采用整數ireturns效果
從句柄指向的內存地址讀取句柄。
Return null //編譯器先檢查這裏,返回值為null,這是正確的。跳過檢查。
結束函數
———————————————————————————
所以我們需要存儲單位、特效、點數、單位組、物品等變量。按照這種格式。
所以我們可以存儲壹個觸發單元:
———————————————————————————
函數H2I接受句柄hreturns整數
返回h
返回0
結束函數
函數I2U采用整數ireturns單元
返回I
返回null
結束函數
函數run不取任何值,不返回任何值
本地單元u = I2U(GetStoredInteger(udg_GC," unit "," Caster "))
//從緩存對應的路徑中讀取存儲單元的地址,通過I2U轉換成單元,然後賦給變量u。
調用RemoveUnit(udg_GC," Unit "," Caster ",H2I(u))
//刪除單位u
調用FlushStoredMisiion(udg_GC,“Unit”)
//清空單元目錄。請註意,刪除整個緩存將會刪除使用該緩存的其他數據。
set u = null
結束函數
函數測試不取任何值,返回整數
局部單元u = GetTriggerUnit() //聲明壹個單元類型的局部變量u,並將其賦為觸發單元。
本地定時器t = CreateTimer() //聲明壹個本地定時器t,並將其賦為新定時器。
調用StoreInteger(udg_GC," Unit "," Caster ",H2I(u))
//將U轉換成整數,存儲在Unit目錄中的Caster標簽下。
調用TimerStart(t,5,false,函數運行)
//啟動定時器T,壹次,持續5秒,函數運行。
設置t = null
//清除句柄變量
結束函數
———————————————————————————
(3)1.24的哈希表(哈希表)
很簡單。它只是把緩存的目錄和標簽字符串記錄的形式改成了整數,還修正了RB,可以直接存儲壹些。
句柄類的數據。
Fetch:調用保存數據類型(哈希表、目錄名、標簽名、這類數據的某個值)
存儲:加載數據類型(哈希表、目錄名、標記名)
清空目錄:調用FlushChildHashtable(哈希表,目錄名)
清除整個緩存:調用FlushParentHashtable(哈希表)
檢測緩存數據是否存在:已保存的數據類型(哈希表、目錄名、標記名)
動詞 (verb的縮寫)觸發器和功能(35秒)
壹般壹個觸發器由三個函數組成:事件函數(初始化函數)、條件函數、動作函數,所以不用懷疑,jass就完事了。
壹個技能或者系統也需要經歷這三個步驟。當然,許多自定義功能通常可以擴展。總體思路不變。打雷了,
我們就此打住吧!10分鐘讓妳基本掌握jass。如需了解更多信息,請前往高級論壇探索!如果有人問我關於我創造的最後壹個單位,殺戮
如何在jass中編寫單位和創建特效?我只能說,最直接最懶的辦法就是寫成T,然後轉換成j。