前言 -...

18
前言 數年前的某一天,我兒子問了我一件事讓我震驚了一下,「爸爸,我的 JAR snapshot 設置弄亂了」。作為一個好奇的老爸以及資深的 Java 程式設計師,我問了他一句話, 「你是怎麼知道 JAR 的?」 我沒想到的是,這樣的一個問題,居然完全改變了我們這些年之間的話題。我從中了解 Minecraft 遊戲是以 Java 程式語言來撰寫的,我的兒子已經安裝了模組(mod),也就 是安裝一些其他的 JAR,來修改遊戲元素。在協助他修復了設置上的問題之後,我的兒 子表達了自己撰寫模組的渴望,於是我們開始一起探索要如何進行。這段過程對我們兩 個來說,得到非常大的收穫,且非常過癮:他教會我有關 Minecraft 的內容,而我教會 了他基本的 Java 程式語言的觀念。從早到晚,不管是在開車到學校的這段路程,或者購 物的期間,還有許多地方,我們都可以互相交換意見。 2012 年聖誕節期間,我們建立了第一個模組,因此決定要分享這些知識給他的 Minecraft 同伴們。就這樣,第一個 Minecraft 模組研習營,我跟 12 位小朋友就在客廳 開始了。大部份的小朋友們沒有學習過程式,更不用說 Java 的開發經驗了。不過,大家 幾乎都很熟悉 Minecraft ,有的小朋友已經玩了兩年,有的甚至是每天玩兩小時之久。談 Minecraft 的話題,這群小朋友談得興高采烈,範圍涉及了不同的遊戲觀念,持續不 斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹 Java 程式語言。 首先,我們建立了第一個很普通的模組,不過出現了許多小問題。接下來,開始慢慢漸 入佳境。在我們學到更多模組、獲得更多經驗時,我們已經能夠改善研習營的品質了。 之後,我和我的兒子開始陸續在世界各地不同的城市協助建立好幾個模組研習營。2013 11 月成立的 Devoxx4Kids 的美國分會(http://devoxx4kids.org/usa/ ),絕對是這些研

Upload: others

Post on 29-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

前言

數年前的某一天,我兒子問了我一件事讓我震驚了一下,「爸爸,我的 JAR snapshot把設置弄亂了」。作為一個好奇的老爸以及資深的 Java程式設計師,我問了他一句話,「你是怎麼知道 JAR的?」

我沒想到的是,這樣的一個問題,居然完全改變了我們這些年之間的話題。我從中了解

了 Minecraft遊戲是以 Java程式語言來撰寫的,我的兒子已經安裝了模組(mod),也就是安裝一些其他的 JAR,來修改遊戲元素。在協助他修復了設置上的問題之後,我的兒子表達了自己撰寫模組的渴望,於是我們開始一起探索要如何進行。這段過程對我們兩

個來說,得到非常大的收穫,且非常過癮:他教會我有關 Minecraft的內容,而我教會了他基本的 Java程式語言的觀念。從早到晚,不管是在開車到學校的這段路程,或者購物的期間,還有許多地方,我們都可以互相交換意見。

在 2012 年聖誕節期間,我們建立了第一個模組,因此決定要分享這些知識給他的Minecraft同伴們。就這樣,第一個 Minecraft模組研習營,我跟 12位小朋友就在客廳開始了。大部份的小朋友們沒有學習過程式,更不用說 Java的開發經驗了。不過,大家幾乎都很熟悉 Minecraft,有的小朋友已經玩了兩年,有的甚至是每天玩兩小時之久。談到 Minecraft的話題,這群小朋友談得興高采烈,範圍涉及了不同的遊戲觀念,持續不斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們

的熱情,然後開始介紹 Java程式語言。

首先,我們建立了第一個很普通的模組,不過出現了許多小問題。接下來,開始慢慢漸

入佳境。在我們學到更多模組、獲得更多經驗時,我們已經能夠改善研習營的品質了。

之後,我和我的兒子開始陸續在世界各地不同的城市協助建立好幾個模組研習營。2013年 11月成立的 Devoxx4Kids的美國分會(http://devoxx4kids.org/usa/),絕對是這些研

Page 2: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

xii | 前言

習營以及其他針對兒童相關技術的研習營中最受歡迎與吸睛的。你可以在附錄 D瞭解一下 Devoxx4Kids。

玩 Minecraft小孩的父母,都會擔心玩電腦遊戲會上癮。這個遊戲本身很有趣,尤其是當小朋友開始建立模組時,就會想辦法讓它更吸引人,這也兼具了娛樂性與教育性。本

書的對象就是針對想要學習如何建構 Minecraft遊戲模組的家長與小朋友。家長或小朋友可以個別來閱讀本書,不過一起閱讀會更有趣。你不需要程式語言的經驗,但是如果

對於軟體安裝比較熟悉的話,會更有幫助(倘若安裝有問題的話,必須要有一些基本排

除問題的知識,不過這些資訊,也可以輕易地透過 Google搜尋找到)。

本書用法

本書不打算教導 Minecraft遊戲的玩法,這是一個很普遍的主題,在官方的 Minecraft wiki(http://minecraft.gamepedia.com/Minecraft_Wiki)裡面就有許多的文章在說明,或者 YouTube上也有許多教學影片。本書附錄 A為沒玩過這個遊戲的讀者提供了Minecraft的基礎介紹。

第一章從模組所需的工具開始,並逐步介紹如何下載並安裝它們。也介紹了如何驗證

下載檔案中內建的範例模組。我們解釋了模組工具的主要觀念,並讓你熟悉 Minecraft Forge術語。本章建構了在之後的章節中建立模組時所需要的基礎。對於任何新技術的學習,章節一開始的觀念介紹對於某些讀者來說或許會感到不知所措,但是很快就會感

到越來越熟悉了。

接著前進到第二章至第五章,將會教你建構修改現行遊戲部分的模組,像是可以產生

爆破的礦車、更具威力的 TNT爆破、彈跳海綿(bouncy sponges),殭屍騎士(zombie knights)。每一章都有特定的主題:打方塊訊息(第二章)、爆破(第三章)、實體(第四章)及移動(第五章)。有一些模組也會有變化性,你可以自行測試看看。

接下來,將說明如何在遊戲中加入一些功能,像是新指令(第六章)、方塊(第七章)、

項目(第八章),以及配方與材質(第九章)。本書示範使用 Forge來建構多個模組。每一章還提供了其他在你學習後還可以進階測試的模組建議。我們鼓勵你能自己多加嘗

試。

當完成這些模組設定後,倘若想分享給這些模組給你的朋友,可以參考一下第十章,瞭

解該怎麼分享。

Page 3: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

前言 | xiii

在本書中,會接觸到許多 Java觀念,包括了關鍵字(keyword)與語法(syntax)、類別(class)、方法(method)、註釋(annotation)、控制結構、陣列(array),以及其他更多觀念。Eclipse工具是用來編寫 Java檔的,因此,你也會學到如何使用這個技術。

本書的重點在於學習,你會發現本書的示範都可以很容易地跟著操作學習。

本書編排慣例

本書使用的字型、字體慣例,如下所示:

斜體字(Italic)

用來表示新名詞、URL、電子郵件位址、檔案名稱與副檔名

定寬字(Constant width)

用來表示程式列表,也用在文章段落中表示程式元素,例如變數或函式的名稱、資

料庫、資料型別、環境變數、敘述,以及關鍵字。

定寬粗體字(Constant width bold)

用來顯示命令,或其他應該由使用者逐字輸入的文字。

定寬斜體字(Constant width italic)

用來顯示應由使用者提供的值、或由背景環境決定的文字。

這個圖示代表一個提示或建議。

這個圖示代表一般註釋。

這個圖示代表警告或注意事項。

Page 4: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

第一章

介紹

Minecraft 是一個可以打破與置放方塊(blocks)來得到材料(materials)的 3D 遊戲。這些材料可以用來打造新的物品(item)與工具(tools)。反之,這些物品與工具可以用來幫助取得更多種的方塊型態。這個遊戲也包括了實體(entities),也就是在Minecraft中能夠動態移動的物體(例如牛、豬、馬)。如果是具敵意的實體稱作怪獸(monsters)(例如殭屍與苦力派(creepers)),魔王(Bosses)則是最難擊敗的怪獸。附錄 A提供了更多有關如何開始 Minecraft遊戲的細節說明。

這個遊戲非常好玩,不過更好玩且吸引人之處是它可以改造(modifications)(通常指的就是在遊戲社群中的模組)。這些模組可以變更遊戲原來的部分設計(例如,變更

TNT炸藥的威力)。除此之外,它們可以加入新內容至遊戲內來改變遊戲元素(例如,新方塊、物品與提煉配方)。

個別玩家是使用用戶端(client),比如將程式下載至你的電腦。雖然用戶端本身不常用,但是它會連結到一台伺服器(server),類似在你的電腦上執行某個應用程式一樣,或者連接到網路上的其他機器上。這稱作單人遊戲模式(singleplayer mode),Minecraft 也可以讓多個玩家進到同一個伺服器,這樣的模式稱作多人遊戲模式

(multiplayer mode)。在自己的機器上運行伺服器算是比較特殊。不過,本書將解釋如何做出模組,並在你的機器上執行你的 Minecraft用戶端與運行伺服器。

在 Minecraft上玩多個模組是很常見的,現在有許多種讓 Minecraft更加有趣的模組,如果有撰寫這些模組的能力,就可以讓玩家完全控制這個遊戲。官方沒有建立模組的

方式,不過有好幾家第三方供應商,提供了這樣的能力,Minecraft Forge便是其中一種 方式。

Page 5: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

2 | 第一章

工具的下載與安裝

為了建立模組,我們需要使用以下的工具:

• Java Development Kit

• Minecraft Forge

• Eclipse

我們來學習這些工具,並了解該如何下載與安裝它們。

你也可以跟著 YouTube上的安裝說明影片來學習

(http://bit.ly/1BqmQ2Z)。

Java馬庫斯·「Notch」·泊松(Markus “Notch” Persson),(通常稱呼為 Notch,Twitter帳號是 @notch(http://twitter.com/notch)),他使用了 Java程式語言撰寫了 Minecraft遊戲。Java是最受歡迎的程式語言之一。像 Notch這樣的遊戲開發者遵循 Java所定義的規則以文字格式來撰寫電腦程式。圖檔以 .png、.gif、或 .jpg作為副檔名。而影片檔則是使用 .mov、.mp4或 .oggy為副檔名。同樣地,Java程式是屬於文字檔,它是以 .java作為副檔名,這些文字檔稱為 Java的原始(source)檔。

Java程式是以文字來編寫,但是電腦只認得 0與 1的二進位語言。因此要轉譯這些文字為電腦可以讀懂的語言,這些檔案必須要經過編譯(compile),在 Java中會經過一些步驟才能完成,Java 開發工具(Java Development Kit,簡稱 JDK),是與 Java整合在一起的一個免費的工具組,就跟瑞士刀一樣,Java也會提供各式工具,最常見的工具如下所示:

javac

Java 編譯器檢查 .java原始檔其類別的語法是否正確,並轉換為二進位(binary)的 .class檔。倘若語法有錯,這些錯誤便會由工具來回報,這種情況 .class檔便無法建立。這個從原始檔轉換成二進位檔的轉換程序,以 Java的專業術語來說,稱作編譯(compilation)。

Page 6: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 3

java

Java 虛擬機器(Java virtual machine,簡稱 JVM)讀取 .class 檔,並將它直譯為二進位說明給電腦。這個一邊讀取二進位檔並一邊在 JVM執行的程序稱作直譯(interpretation)。

jar

通常是用在將多個 .class 檔及其他檔案,例如圖像檔與一些設定檔一起打包(archive)起來,打包後的檔案會以 .jar做為副檔名。

這些工具用起來很簡單,大部分的時候,你甚至不需要去了解,它們會在背景幫你完成

所有的工作。本章稍後就可以看得到。

針對 Minecraft模組,我們會撰寫 Java原始檔,這些檔案會轉換成二進位的 .class檔,然後使用由 JDK所提供的工具將其打包成 JAR檔。在你執行 Minecraft,以及稍後建立模組之前,你必須先安裝 JDK。

要開始使用 JDK,需先至 Oracle下載頁面(http://bit.ly/TEA7iC),並依照指示(http://bit.ly/1ESTUoY)安裝至你的電腦中。

倘若你不確定 JDK是否已經安裝至你的機器中了,跟著網站上的安裝指示來進行。倘若JDK已經安裝至你的電腦中了,重新安裝只會更新為最新的版本而已,也就是本書所推薦的版本。

Minecraft ForgeMinecraft Forge是可以協助你建立模組的工具。Forge是目前修改這個遊戲最受歡迎的方式。其他的模組建構工具,像 Bukkit或 ModLoader,不是已經關閉就是過時了。

要使用 Forge,需先至 Minecraft Forge下載頁面(http://files.minecraftforge.net/)。如圖 1.1所示,你需要選擇 Minecraft的版本來下載。

圖 1-1 挑選 Forge版本

從下拉選單中,選取 1.8。現在頁面應該會顯示如圖 1-2所示。

Page 7: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

4 | 第一章

在本書編寫期間,最新的 Forge版本是 1.8,這個版本可能會隨著書籍的

出版或你開始閱讀的日期不同而有所變動。請跟著選取最適合的版本。本

書的模組是以 Forge1.8來製作。倘若之後 Forge的版本不適用於本書的

模組,我們會更新本書,以及 GitHub 上的原始碼,附錄 C 則包含了

GitHub原始碼的有關細節。

圖 1-2 Forge下載

在圖 1.2中的列表,第一項是最新的 1.8版。請在這一列中點擊 Src的連結,接著會導引至一個 AdFly的頁面。等待幾秒之後,點選右上角的 Skip Ad來下載 ZIP檔。這個檔案包含了 Forge的原始碼,以及可利用的模組。

請注意我們還沒有安裝過任何的東西,它可能會試著下載安裝器(Installer)。這個檔案只是用來在你的 Minecraft啟動器中安裝 Forge函式庫(library),如此一來就可以透過它來載入模組,不過不是用它來製作模型。到目前為止只是下載一個壓縮檔(ZIP檔)而已,我們會利用這個檔來產生給 Minecraft的原始檔。

EclipseEclipse是一個整合開發環境(integrated development environment 簡稱 IDE)。IDE是可以編輯檔案、封裝(package)、執行檔案,以及修復檔案中錯誤的工具。有許多的IDE可以使用,不過本書採用了 Eclipse來建立我們的模組。

我們大部份會使用 Eclipse來建立新檔案、編輯這些檔案,然後執行遊戲來觀察結果。Eclipse是一個非常重要的工具,如果沒有使用這項工具,即使能夠使用其他文字編輯器來編輯原始檔,也無法執行遊戲做進一步的測試。

Page 8: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 5

要開始使用 Eclipse,請至 Eclipse下載頁面(http://www.eclipse.org/downloads/),圖1-3顯示了在 Window電腦中所呈現的頁面。右上角的下拉式選單預設為 Windows,不過你可以依據你的作業系統來做變更。

圖 1-3 Eclipse下載

點選合適的連結來下載正確的版本。

Eclipse的版本在撰寫本書時是 4.4.1版,它的版本有可能會隨著出版日

期以及你閱讀本書的時刻而有所變更。下載最新可取得的 Eclipse版本是

沒有問題的。

Eclipse的安裝很簡單:它只是將下載檔解壓縮即可。Eclipse網站提供安裝程序的細節介紹(https://wiki.eclipse.org/Eclipse/Installation)。

在 Eclipse設定 Forge在模組建立之前,必須先在 Eclipse設定好 Forge。首先,在桌面上建立一個新的目錄,並命名為 forge。Windows作業系統下,可以同時按下 Ctrl鍵與 Esc鍵,接著會出現一個文字框,讓你輸入要執行的提示命令(在 Windows 8.0或 8.1,則使用 和 R鍵)。此時輸入 cmd並按下 Enter鍵,就會打開一個命令提示視窗(Command Prompt)。在Mac作業系統,則是同時按下 command鍵與空白鍵(譯註:若是有使用多語言切換,則是同時按下 control鍵加上空白鍵)來帶出 Spotlight,Spotlight可以讓你在 Mac上以不同的指令做搜尋。輸入 terminal來打開終端機(Terminal)視窗。

Window的命令提示與 Mac的終端機可以讓你在作業系統查詢所有目錄、輸入指令來做操控,以及進行許多有趣事情的預建工具。現在我們的重點在於切換至適合的目錄並建

立一個新的目錄來存放 Forge。

Page 9: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

6 | 第一章

在提示命令或者終端機下,連續輸入以下的指令來建立目錄,並切換至該目錄:

cd Desktopmkdir forgecd forge

接下來,將先前所下載的 ZIP檔移至這個新建的檔案目錄中。倘若你使用的是 Mac,點擊檔案兩下,將其解壓縮至這個目錄。如果是 Windows的話,則在 ZIP檔上按右鍵,然後選擇解壓縮所有檔案,接著選取要釋放內容的目錄位址。這樣就會建立一個新的

forge/目錄。要切換至該目錄的方式是輸入 cd forge指令。

在 Windows電腦輸入 dir指令,或者在 Mac電腦上輸入 ls指令,就可以見到目前目錄內的內容。倘若你的內容沒有跟圖 1-4類似,那麼就移到下一個檔案夾並試著使用 dir或 ls指令,看一下結果是否與圖 1-4相符合。

圖 1-4 在命令提示下的 Forge檔案內容

這邊的檔案如果看不懂的話,不用擔心(我們會進一步解釋)。如果輸出的結果正確的

話,執行範例 1-1的指令來設定 Forge。

範例 1-1 設定 Forge的工作區(workspace)

gradlew setupDecompWorkspace eclipse

在 Mac,你可能需要輸入 ./gradlew 指令來取代 gradlew。

在執行這些指令前,請確認你的電腦已連上網路了。

Page 10: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 7

範例 1-1的指令會將所需要的檔案下載至你的電腦中,並準備好存放模組的目錄。這個步驟可能會花上 5至 30分鐘,依照電腦的速度與網路連結狀況而有所差異。倘若一切順利,就會輸出以下的結果:

BUILD SUCCESSFUL

大部份的情況會見到這樣的輸出結果。不過,若你沒有見到這個訊息,表示指令沒有成

功執行。發生這種情況有幾種原因。首先,用來存放模組而建立的目錄可能出錯,如果

是這樣的話,你應該要等個幾分鐘,然後再重新下一次指令。另一個情況是,查詢一下

Minecraft Forge網站(http://bit.ly/1NfDPvn)的說明。這裡的說明可能會過時,在這本書撰寫時,它們是 1.6.4版。不過 1.6.4版本的安裝方式與 1.8版本是相同的,所以不需要擔心版本問題。

另外,如果得到以下的錯誤訊息也可能會造成指令執行失敗:

Execution failed for task ':deobfuscateJar'.

> Java heap space

遇見這種情況的話,則可編輯Windows上的 gradlew.bat檔或者 Mac上的 gradlew來修復。在 Windows電腦,你可以使用記事本(Notepad)來編輯檔案,你可以在提示命令列輸入 notepad,並按下 Enter鍵來打開檔案,檔案打開之後,導覽至檔案→打開 ...並從正確的目錄中選取 gradlew.bat檔。

在 Mac的話,你可以使用 TextEdit來編輯檔案。一開始是到應用程式(Applications),並點擊文字編輯(TextEdit)。導覽至檔案→打開 ...然後選取 gradlew 來打開檔案

不管是哪一種系統,都一樣變更 DEFAULT_JVM_OPTS=""為 DEFAULT_JVM_OPTS="-Xmx1024m"。變更完成之後,儲存檔案並離開文字編輯器,然後回到指令列。

如果還是沒辦法運作的話,你可以查詢一下 Minecraft Forge 論壇(http://www.minecraftforge.net/forum/)。然後尋找一下目前主題所需要的資訊,如果還是沒有找到的話,你可以將你的問題刊登上去尋求解答。

設定完成之後,在安裝 Eclipse的目錄下來打開 Eclipse,如果使用Windows的話,則點擊 eclipse.exe兩下,Mac的話則是點擊 eclipse檔案。Eclipse是一個可以進行 Java檔案編輯的工具,預設中,它是不知道你要製作 Minecraft模組。你必須告訴它你想要這麼做,並告訴它 Forge程式的位置以及模組要存放的位置。這些所有的資訊是儲存在一個專案(Project)中,這也是在執行範例 1-1的指令時幫你所建立的其中一部分。

Page 11: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

8 | 第一章

專案的細節是儲存在 workspace,基本上這是儲存你的專案所有細節的目錄,方便你可以輕易的做管理。一個工作區(workspace)可以擁有多個專案。在打開 Eclipse之後,你便會見到如圖 1-5的視窗。

圖 1-5 工作區的選取

點擊 Browse...來選取工作區並導覽至已經解壓縮的 forge/檔案。在這個檔案夾中,應該還有另一個稱作 eclipse/的檔案夾。選取後點擊該檔案夾,然後點擊 Open。最後點擊OK來完成選取。

確認你有選取 eclipse/檔案夾,否則你將無法進入你的專案。

倘若你不小心點擊了 OK按鈕,沒有選取正確的工作區位置,那麼就離開 Eclipse然後重新打開它。它會再次提醒你有關工作區的選取步驟。

在 Eclipse選取了正確的工作區位置之後,你的專案便會開啟,如圖 1-6所示。

Page 12: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 9

圖 1-6 Eclipse工作區與專案

Eclipse視窗有幾個主要元件:

套件瀏覽器(Package Explorer)

位於左側的面板,用來顯示專案結構部分。

中間大區塊空白視窗

這裏是打開專案檔案後,可以編輯程式的地方,可以同時打開多個檔案,並以不同

的頁籤(tab)顯示在視窗上。

狀態視窗

位於畫面的底部,這個視窗有多個頁籤用來指示我們在 Eclipse中所執行的不同任務狀態。舉例來說,Minecraft 伺服器主控台(console)在遊戲啟動之後會在這邊做 顯示。

右側部分有幾個其他的視窗,不過它們跟我們的模組並沒有相關。你可以點擊 X來關掉它們。

Page 13: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

10 | 第一章

認識一下範例模組

模組的撰寫是存成 .java檔案,接著會編譯成 .class檔案。如稍早所述,每一個 Java類別是以文字為基礎的檔案,副檔名是以 .java做為結尾。一個類別(class)是根據 Java程式語言的規則來定義而成。

在 Eclipse,點擊 Minecraft/檔案夾旁邊的箭頭。如圖 1-7所示,你可以展開檔案夾,因此你可以進一步來存取它的內容。

圖 1-7 Eclipse工作區與展開 Minecraft專案檔案

在展開的檔案夾下面還有許多的次檔案夾(在前面會出現另一個箭頭指示)以及幾個檔

案。這些大多數都是建立 Forge的 JAR檔所必要的檔案,不過,還好我們不需要擔心它們。現在,我們來看要在哪邊加入我們模組的原始檔。

點擊 src/main/java檔案夾旁邊的箭頭,便會展開這個儲存所有 Java原始檔的檔案夾。點擊 com.example.examplemod 來展開次檔案夾。裡面有一個 ExampleMod.java的 Java原始檔,這個原始檔是 Forge內建的範例模組。點擊這個檔案兩下,便會在 IDE的中間處顯示它的內容,你可以在這裏做檢視與變更。

這個 Java類別的內容如範例 1-2所示。

Page 14: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 11

範例 1-2 範例模組

package com.example.examplemod; ❶

import net.minecraft.init.Blocks; ❷import net.minecraftforge.fml.common.Mod;import net.minecraftforge.fml.common.Mod.EventHandler;import net.minecraftforge.fml.common.event.FMLInitializationEvent;

@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION) ❸public class ExampleMod ❹{ public static final String MODID = "examplemod"; ❺ public static final String VERSION = "1.0"; @EventHandler ❻ public void init(FMLInitializationEvent event) ❼ { // 一些範例程式 ❽ System.out.println("DIRT BLOCK >> "+Blocks.dirt.getUnlocalizedName()); ❾ }}

先不要對這段程式中不同的 Java關鍵字(keyword)、括號以及格式感到擔憂。不過,有一些主要的 Java關鍵字你應該要了解:

❶ 每一個類別是屬於一個套件(package),在 Java中是使用 package關鍵字來做識別,接著是空格,然後是套件名稱,最後以分號(;)來做結尾。這個必須做為 Java類別的第一行。同時它也定義了你的檔案位置(以這個範例來說,是 /example/examplemod)

Java套件可以讓邏輯上相關的類別群組在一起。這允許了相似的類別名

稱可以在不同套件中使用。這好比像是在不同的桶子中搜尋不同的蠟筆一

樣。如果沒有透過分類,很難找出正確的蠟筆,同樣的,如果在多個套件

中如果沒有組織好類別,將會不容易做尋找。

❷ 一個 Java類別可以使用來自不同套件的 Java類別。這些類別需要被導入(import)進來,這樣才能參照其內的程式。不過要注意的是,這並不表示其他類別被加進裡

面,它們只是可以在這邊被使用而已。上面程式範例中導入了四個類別。

Page 15: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

12 | 第一章

每一個導入的陳述(statement)都是加上了 import關鍵字,並提供了完整合格的類別名稱。舉例來說,Blocks類別是在 net.minecraft.init套件中,因此它是導入net.minecraft.init.Blocks,而 Mod類別是在 net.minecraftforge.fml.common套件中,所以它是導入 net.mine craftforge.fml.common.Mod。一樣的,其他類別也分別從相對應的套件中所導入。

❸ @Mod告訴 Forge這個類別是一個模組,並提供了一些有關模組的基本資訊。最前面這個 @符號,表示這是一個 Java 註釋(annotation),可以讓 Java在程式中定義特別的標註。這個特別註釋的實際行為是由 Forge所定義的。

Java註釋可以是一個或者多個提供有關註釋細項的元素(element)。每一個元素可以使用等號(=),來指定值給它,不同的元素以及其對應值,需要以逗號來作分隔。

這裏的 @Mod註釋有兩個元素:modid與 version。它們的值分別是由類別中 MODID與VERSION變數(variable)所定義。

❹ 每一個 Java類別是在 Java的關鍵字 class之後加上一個唯一的名稱,這個名稱需要跟檔名相符,不過沒有 .java這個副檔名。我們的類別名稱是 ExampleMod,因此它會以 ExampleMod.java來儲存。

類別內容所定義的範圍(scope)是以一個開括號 {為開始,閉括號 }做為結尾。這表示所有定義在這對大括號內的一切內容都是屬於這個類別。

❺ 定義 MODID與 VERSION變數。變數是用來儲存一個特定型態(type)的值。每一個變數都有一個名稱加上一個對應的型態。以這個範例來說 MODID與 VERSION是名稱,而String是一種表示可以儲存文字資料型態。每一個變數是以 =來將包在引號內的值指定給它。MODID變數有一個 examplemod的值,而 VERSION變數則指定為一個 1.0的值。

Java是個大小寫有別的程式語言,所以確認你的程式要跟本書上面的程

式完全相同才行。舉例來說 String的 S如果你打成小寫,那就會出現錯

誤,因為 string不是一個 Java 類別,String才是。因此 MODID與 modid

分別是代表不同的變數。

❻ Forge模組是以「監聽(listening)」不同事件(events)來建立。事件是在你的世界發生的某件事,例如初始化一個模組、玩家打破方塊、一個實體爆炸、殭屍死

亡或者玩家傳遞一則聊天訊息(chat message)。而事件是由事件處理器(event

Page 16: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 13

handler)所處理。在 Forge模組內的事件處理器,會以一個 @EventHandler註釋來標示。

❼ Java程式中是以建立新方法(method)來加入新的功能。一個方法有四個部分:

• 名稱,也就是方法的唯一識別名(以我們的例子來說是 init)。

• 參數(Parameter),使用不同的值來提供不同的功能。每一個參數有一個參數

名與一個型態。在我們的方法中,有一個 FMLInitializationEvent的型態以及event的參數名。所有的參數都放在 (與 )內,而不同的參數則是以逗號來做區隔。

• 主體(Body)是以 {與 }將 Java程式包覆在其中,當這個方法被呼叫時才會執行程式內容。就如類別一樣,這對括號定義了方法的範圍。在這裏定義了所有要

發生的動作。

在一個方法內的陳述,通常是由上而下依程式出現的順序來執行。

• 回傳型態(Return type)則定義了可以讓函式呼叫者(caller)所使用的回傳值。倘若這個方法沒有回傳值,則使用一個專有的 void型態。

init方法是一個特別的方法,在 Forge載入模組時會呼叫它。這裏也是作為定義模組主程式的地方。

❽ 這一行是表示 Java中的註解(comment),用來提供一些讓其他程式設計者能夠理解這段程式所代表意義的資訊。註解可以用雙斜線,也就是使用 //來做原始碼的單行註解。你也可以用 /*與 */來做多行註解。

❾ 這一行程式,裡面有許多的 Java觀念:

• System.out.println 這一行會印出訊息至 Minecraft的伺服器主控台。這與方法的呼叫一樣,而參數則是放在 (與 ) 內。

• 首先針對在引號內的 DIRT BLOCK >>部分,這裏就是將引號內的內容印出來,不過引號本身則不會列印。

• +符號則是將第一個字串與呼叫第二個方法回傳回來的值做相加。

• Blocks.dirt.getUnlocalizedName()回傳的是泥土方塊的名稱。

下一節的內容為檢視顯示在主控台上的實際訊息。

Page 17: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

14 | 第一章

執行 Minecraft並驗證模組我們來啟動這個遊戲,看看這個模組做了什麼事!

按下如圖 1-8所示的綠色箭頭來執行這個遊戲。

圖 1-8 以 Eclipse來運行 Minecraft

執行這個遊戲時,在背景發生了許多事。記得 javac、java與 jar,這些我們之前安裝 JDK工具的一部分嗎? Eclipse使用這些工具來編譯我們專案內(包括了 Forge原始檔案與我們的範例模組)所有的 Java原始碼為類別檔案。接著再將這些檔案封裝成 JAR 檔。然後這個 JAR 檔被用來執行 Minecraft 伺服器及用戶端的啟動器(client launcher)。這個用戶端也會同時連上這個伺服器。如圖 1-9所示。

圖 1-9 Minecraft預設的用戶端

Page 18: 前言 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A464.pdf斷地使用遊戲特定的專有名詞與術語,彷彿在聊不同語言一樣。我的目標就是激起他們 的熱情,然後開始介紹Java

介紹 | 15

用戶端視窗的左下角顯示了 Forge的版本,在這裏是 1.8版。它也顯示了目前所載入的模組數,以這個範例來說是四個模組。其中三個模組是 Forge必要執行的預設模組,而第四個就是本章所說明的範例模組。

在 Eclipse中,伺服器的主控台是顯示在一個頁籤內,如圖 1-10所示。

圖 1-10 Eclipse內的伺服器主控台

圖 1-10顯示一個空的伺服器主控台,但是這裏會列出來自伺服器紀錄(log)的訊息。你應該會在 Minecraft伺服器主控台上見到這個訊息:

[Client thread/INFO] [STDOUT]: [com.example.examplemod.ExampleMod:init:18]: DIRT BLOCK >> tile.dirt

當模組載入後,Forge呼叫之前所解釋過的 init方法。然後執行方法內的程式,基本上這裏只是印出泥土方塊的遊戲名稱。你需要往上捲動一下主控台才能見到這個訊息。

而現在你已經執行了 Minecraft用戶端,並且可以像平常一樣開始玩這個遊戲,不過跟之前不一樣的地方是,你已經可以依照你的喜好來修改遊戲了,是不是比只玩遊戲還來

得令人興奮呢?

總結

哇,你已經來到了第一章的最後部分!

本章解釋了如何開始使用 Forge來建立 Minecraft模組。我們下載與安裝了模組所需要的工具。並在 Eclipse中開啟了專案的基本結構。也介紹了 Eclipse的基本佈局。Java的基礎觀念,像是類別、套件、方法,也透過了模組做了說明。最後,我們執行了

Minecraft用戶端,同時也驗證了範例模組的輸出結果。

你已經設定好並建立了新模組。本書中的所有模組大部份都是遵循這個範例的基本模

式,你只需要建立新檔案並做修改即可。在下一章你將會見到實際的動作。