潛水黨的簡單lua教程五
之前簡單的說明了一下lua以及jass的語法。
這里貼一下lua的基礎教程鏈接:https://www.runoob.com/lua/lua-tutorial.html
這個教程概括了所有l(wèi)ua的基礎內容,十分的通俗易懂。
下面開始說說如何創(chuàng)建一個可以編寫lua的基礎war3地圖。
首先打開YDWE的配置文件,見示例1

當然除了編輯器界面,還有另外一種方法打開配置文件,見示例2

找到配置文件雙擊點開后,找到魔獸插件項,勾選上lua引擎,見示例3。

然后再切到系統(tǒng)關聯(lián)項,勾選上關聯(lián)地圖文件的.w3x和.w3m,見示例4

通過ydwe創(chuàng)建一個基礎地圖,這里不作贅述,詳情見示例5

通過界面上方的模塊打開觸發(fā)編輯器,見示例6

通過界面上方的模塊,有一個小寫A的按鈕,打開觸發(fā)編輯器,見示例7

刪掉原先的觸發(fā),或修改掉名稱,命名規(guī)范是一件很重要的事情。
然后寫入以下觸發(fā):
事件 - 地圖初始化
動作 -?
游戲 - 輸入作弊碼:exec-lua:lua.base
(輸入作弊碼:exec-lua:)效果等同于lua里面的require,作用是調用地圖內的lua腳本。
見示例8。

之后的lua.base,這個是我寫入口文件的個人習慣,讀者可根據(jù)喜好自行修改。
如修改成base、main等等,都毫不影響。


jass的目錄結構使用的分隔符為\\
但在lua里面,require文件使用的分隔符有所變化,以.代替\\
所以這里lua.base的意思可以理解為lua\\base.lua
即調用地圖內,lua文件夾內的base.lua文件
所有的lua腳本,結尾后綴都為.lua
如果沒有在前面加上lua.
那么就會檢索地圖內的base.lua、main.lua文件
以上就是用Trigger寫lua入口的方式。
這里再提供兩種通過jass寫lua入口的方法。
還是先刪掉所有的觸發(fā)器,然后通過w3x2lni.exe將地圖解包成目錄結構,見示例11。

找到目錄結構內的war3map.j文件,用記事本打開,見示例12。

找到函數(shù) YDTriggerSaveLoadSystem__Init,這個函數(shù)會在地圖的main入口內加載。
因此在這里添加一行代碼:call Cheat("exec-lua:lua.base)
同樣能起到和示例8一樣的效果。

除了使用記事本以外,也可以通過之前我提到的vscode來打開war3map.j文件來編輯。
同樣是找到war3map.j,然后添加:call Cheat("exec-lua:lua.base)
見示例14

不要忘記保存,而且之后的操作全部在vscode內進行。
都改好了之后,在map目錄內新建一個名稱為lua的文件夾,新建一個名稱為base的lua文件。
開始編寫代碼,詳情見示例15:

接下來將地圖目錄拖到w3x2lni內,點擊obj轉成w3x文件,注意是地圖目錄,并非地圖文件。
見示例16:

右鍵ydwe測試地圖,你會看到除了成功進入游戲之外,還會彈出一個黑色背景的窗口,這個窗口就是控制臺(cmd),詳情見示例17/18


print是一個非常重要也是使用頻率非常之高的函數(shù),他可以打印出一些消息,方便你不斷調試代碼以及進行代碼排錯。
但lua本身的print函數(shù)是無法打印中文消息的,因此你需要打印中文消息時,需要覆蓋掉print函數(shù),使用ydlua引擎內的控制臺來打印消息。
見示例19/20:


如果你沒有去覆蓋print函數(shù),那么打印出的中文就會變成亂碼,見示例21/22:


至此,所有基礎的設置都已經調好了,現(xiàn)在已經可以開始通過lua去編寫地圖了。
這里講一下有關lua作圖的一些知識點。
ydlua取消了原生lua的一些功能,即ydlua不推薦你去使用這些功能,所以它給你注釋掉了。
但這些被取消的東西并不影響你作圖,ydlua的內容完全支撐你做出一張好圖,記住這一點就好了。
require函數(shù)是用來調用其他lua腳本的。
原生lua支持你調用任何目錄內的腳本,但ydlua的范圍僅在你地圖文件內,也就是只能調用你地圖文件里的lua腳本,無法調用地圖文件外的lua腳本。
如果你想調用地圖外的lua腳本,那么你需要用到一些特殊方法,而不是直接require 目錄+文件名。
ydlua不只是可以在地圖內的腳本調用,在地圖外的腳本依然可以調用,但效果只能依靠你的地圖來運行。
想要熟練掌握lua作圖,前置條件是學會jass,你可以不精通,但你需要會寫和看懂jass。
因為require "jass.common"內是cj的所有函數(shù),如果你看不懂jass,那么你寫起來就會很費勁,所以熟練掌握lua作圖的前置條件就是jass入門。
命名規(guī)范很重要!命名規(guī)范很重要!命名規(guī)范很重要!
命名規(guī)范就是文件、變量、函數(shù)的名稱規(guī)范,很多作者在使用T作圖的時候,變量命名都很隨意,常用命名基本都是以下幾種:
從二十六英文字母表、阿拉伯數(shù)字內取其中一個當做變量名。
更有甚者喜歡用中文當做變量名。
這種命名方法都是不規(guī)范的,喜歡中文當然沒問題,但變量、函數(shù)名都是不能使用中文的。
雖然文件名可以使用中文,但我這里依然不推薦你使用中文來命名腳本、目錄。
這里有人要說了,為什么ydwe里的逆天局部變量可以使用中文來命名變量呢?
因為ydwe里的逆天局部變量從嚴格意義上來說,它并不是真正的局部變量。
而jass內的局部變量,它只能在函數(shù)塊的置頂去聲明,但逆天局部變量明顯違反了這一規(guī)則,可以在任何地方去聲明并且獲取。
而逆天局部變量的變量名稱,是一個字符串類型,字符串是可以輸入中文的。
規(guī)范的命名方法有以下幾種:
第一種、駝峰法:
這一種也是我最喜歡的命名方法,同樣也是common.j和blizzard.j里用到的命名方法,也被細分為大小兩種命名。
大駝峰法:GetUnitName(獲取單位名稱)
小駝峰法:getUnitName(獲取單位名稱)
我個人習慣以大駝峰法來給函數(shù)命名,小駝峰法給變量命名。
第二種、蛇形法:
優(yōu)點是看上去更加簡潔,而且無需切換輸入法,方便快捷。
示例:get_unit_name(獲取單位名稱)
第三種、串式法:
這種方法在jass和lua里面并不支持,只是有這么一種命名法而已,我這里提一下,不推薦大家使用,而且與蛇形法區(qū)別不大。
示例:get-unit-name
第四種、匈牙利法:
與小駝峰法類似,首字母必定是小寫,用于區(qū)分變量的類,即類+變量名,優(yōu)點是能夠明確區(qū)分出變量的類型和含義,缺點是增加了不必要的記憶負擔,因為你需要同時記憶出首字母代表的類和后面的名稱,看需求以及個人喜好使用即可。
示例:sGetUnitName(獲取單位名稱)
s代表了string這個類,GetUnitName代表了變量的意思。
了解到命名方法之后,那么變量該如何命名呢?
可讀性強的名稱優(yōu)先于簡短的名稱,盡量使用完整化的稱謂,不要圖方便就去簡寫。
見示例23:

除此之外盡可能的避免混淆,誤導,或者含糊不清的詞匯。
這也許會很困難,但堅持下去一定會有一個好的結果。
培養(yǎng)一個好的寫代碼習慣相當重要,除非你能保證永遠只有你一個人寫代碼,不會有其他人去看你的屎山代碼。
其他的等我想到再補充吧,下次聊一下函數(shù)(function)和觸發(fā)器(trigger)