ETH官方钱包

切換
舊版
前往
大廳
主題

【Forge】一個正確編寫GUI的正確姿勢。Part 03

格子@懷念光牧的社畜 | 2015-03-12 13:24:23 | 巴幣 1006 | 人氣 257

前言:
        本篇有高能反應,非戰鬥人員請盡速迴避。
        戰鬥人員請穿上防護衣。

第1節:GUI主體的良好熊抱體態。
        首先請各位先建立一個class檔命名為GuiFirst。(不強迫,個人喜好命名。)
        接著將它extends GuiScreen。
        如下。


        我懂得,它看起來很可愛,小小der。XD"
       接下來我們加入一些我們可能會用到的函式,接著覆寫(Override)它。
        
       別忘了每個要置換的方法上頭要加上@Override,讓系統檢查一次是否正確覆寫。
       以免弄到最後,因為大小寫失誤的關係,Debug許久噢!
       還有要用super去呼叫父類的方法,不然他們還是不會動作噢!

       第一個initGui()函式用於當GUI開啟時的初始化,例如按鈕、標籤的初始化。
       第二個drawScreen()函式在GUI開啟的狀態時,每單位時間都會被呼叫,主要用於顯示GUI
       主體,請注意,是"每單位時間都會呼叫"!
       第三個mouseClicked()函式顧名思義就是在滑鼠被按下的時候,會進行呼叫。
       第四個keyTyped()函式在打字的時候會進行呼叫。
       第五個actionPerformed()函式在GUI上頭的按鈕被按下的時候會進行呼叫。
       第六個doesGuiPauseGame()函式適用在單人遊戲,它會回傳一個布林值(Boolean),來
       代表GUI被開啟的時候,是否暫停遊戲。類似單人遊戲中Esc的效果。

       以上幾個就是比較常用到,定義在GuiScreen.class檔裡頭的幾個方法,
       如果想知道更多的方法,可以上網去查閱API、或者是點進去GuiScreen.class檔看看。

       再來,請把有防護衣的勇者們穿上吧。

第2-1節:如何幫GUI先生穿上好看的衣服?       之我們先搞定封包吧。
       回歸主旨,有一些人模組所希望的功能不全然相同,
       每個人需要GUI開啟的時機點也是不一樣。

       在這邊我只簡單的舉個例子,實際的操作、構想,還是依照各位自由。
       首先我希望我的GUI可以在玩家登入的時候開啟。

       那我們再一次的轉到ClientPacketHandler.class來編輯相關的資訊吧!
       上一部份我們僅僅建立的唯一一個封包只能拿來"通知玩家開啟GUI"。
       那們這次我們就來完善整個傳接球的機制,讓客戶端看懂如何正確的接球、並且處理。


       我們直接從Switch(30)開始講起。
       這邊我們接收到封包之後呢,會讀出一個packetID,來辨識這個封包,
       由於這邊我們的封包系統僅僅拿來做GUI的資訊傳輸,
       所以讀取出來的packetID同時也是GUI ID,那麼在GUI_FIRST的case裏頭,
       我們得知了伺服端要求我們開啟編號GUI_FISRT的GUI,
       於是系統將接收者(EntityPlayer)做一個openGui()的動作。

       openGUI(Object mod, int modGuiID, World world, int x, int y, int z);
       第一個參數使用的是我們再Main裏頭(Tutorial.class)註冊的instance、
       第二個則是GUI的唯一integer ID、
       接著是世界、XYZ座標。

       這邊將這個函式註解掉的原因是,
       我們還沒有處理好GUIHandler.class,想必大家都已經忘記這貨的存在了。

       
       我們是在客戶端開啟GUI,所以我們要處理的是getClientGuiElement()。
       其實這邊也是非常的簡單,
       
       當接收到openGui()的函式的時候,下去判別要初始化哪一個GUI,並且開啟。
       在這個例子當中,當然就是我們剛剛建立的GuiFirst()。
       由於GuiFirst.class檔裡頭,建構子並沒有要求任何參數,所以我們也無須給予任何參數。

       那麼接下來我們就可以測是這個GUI囉!

第2-2節:如何幫GUI先生穿上好看的衣服?       之休息一下,喝杯茶。
       睽違了那麼久,終於可以開啟遊戲稍微看一下了嗎?
       當然是還沒有。

       我們先來簡單的回顧一下到底做了些甚麼事情吧!
       建立了一個簡單的封包傳輸系統、還沒有衣服的GUI先生、控制GUI的GuiHandler。
       好像少了些甚麼?

       我們少了投手。
       再次說明:這個GUI開啟的時機是,伺服器請玩家開啟GUI,那麼如果要請伺服器傳輸封包
       給客戶端來開啟GUI的話,是不是要發送一個封包呢?

       是的,我們截止到現在,都還沒有寫出請伺服器發出封包的程式,事不宜遲,開始動手
       吧!

       你需要一個玩家登入的事件,這邊我比較偷懶,就先寫進去ProxyServer.class檔案裡頭。

       當然不是這樣寫一寫就好囉,
       事件要使用之前得先註冊,於是我們還要回到Main檔(Tutorial.class)裏頭去進行註冊。
       在第(30、31)行就是我們的事件註冊。
       事件有兩種,分別是FMLCommonHandler跟MinecraftForge來處理,因為我嫌麻煩,
       所以就乾脆兩個都註冊了。

       寫到這邊,先把防護衣脫下來,喝杯茶、上個廁所吧!

第2-3節:如何幫GUI先生穿上好看的衣服?       之再休息一下,看一下成果吧!
       弄到這邊,總該可以測試了吧?
       
       好吧,請開啟Debug裏頭的Server還有Client,然後進入127.0.0.1的內部伺服器測試吧!

       你會發現很詭異的事情,為什麼滑鼠動不了。


       原因是:目前你的GUI開啟開來,甚麼都沒有顯示,所以當然無法移動囉,開著一個透明的
       GUI不能動噢!
       不過如果你按下Esc關閉那個"透明的GUI",你就可以移動了。

       我們總之先加入一點東西吧。不然開啟透明的GUI很詭異。
       回到我們的GuiFirst.class檔,然後到drawScreen()方法裡面加上一行。

       讓它顯示一個半透明的黑底,最後你會得到:


       下一章我們就可以開始幫她穿上衣服囉!

最後:
       沒有準備好圖片的趕快去準備啊!(指
       感謝各位的收看。
       
       本章有一點小小Java的知識,如果有任何解釋上的錯誤,歡迎留言指正。
       老樣子工商請自行查閱Part 01,我們下次再見!

創作回應

相關創作

更多創作