當你想要在CSO LUA中建立更多元的UI物件時,官方僅提供了UI.Box和UI.Text兩個選項。但是,如果你希望有更多自定義的UI物件,你可以透過手刻Class物件來實現。這樣一來,你就能夠根據自己的需求來客製化UI物件了!
Lua 中的物件導向
Lua 是一種輕量級的語言,沒有內建的 class 概念,但可以通過其他方式模擬類似的行為,例如使用表(table)和元表(metatable)來實現對象導向的編程。如果對此不太熟悉,可以參考一些線上資源,比如這個網站。
文字陰影 UI 物件
假設我們要創建一個自定義的文字陰影 UI 物件。首先,讓我們看一下如果不使用 class 的話,程式碼會是怎麼樣的:
1 | TextShadow = UI.Text.Create() |
這樣的程式碼看起來相當冗長且不易維護。現在,讓我們看看如何使用 class 來實現同樣的功能。
定義 TextShadow Class
TextShadow = {}:這一行創建了一個名為TextShadow的空表,用於存儲自定義物件的方法和屬性。function TextShadow:Create():這一行定義了一個叫做Create的方法,該方法用於創建新的TextShadow物件。使用 : 語法定義的方法隱式地將物件自身作為第一個參數(類似於其他語言中的 this 或 self)。- 在
Create方法中:
- 首先,創建了一個名為
newObject的新表,用於存儲TextShadow物件的屬性和方法。 - 在
newObject表中,設置了一個叫做SetArg的表,其中包含了一系列的屬性,用於設置陰影效果的參數。這些參數包括了文本內容 (text)、字體 (font)、對齊方式 (align),,位置(x 和 y),大小 (width 和 height),顏色 (r、g、b 和 a) 以及偏移量 (offset)。 - 接著,創建了一個
UI表,其中包含了兩個名為back和front的屬性,這些屬性分別表示陰影的背景和前景,並且使用了UI.Text.Create()方法來創建相應的文本 UI 物件。 - 最後,設置了一個名為
visible的屬性,表示該陰影是否可見,並將其設置為預設值true。
總的來說,這段程式碼創建了一個具有自定義屬性和方法的 TextShadow 物件,用於表示文本的陰影效果。通過這種方式,可以方便地創建。
來自 ChatGPT 說明
1 | -- 定義物件 |
上述程式碼定義了一個 TextShadow Class,其中包含了一個 Create 方法用於創建新的 TextShadow 物件。該物件包含了一個 SetArg 表,用於存儲設定參數,一個 UI 表用於存儲 UI 元件,以及一個 visible 屬性用於表示陰影是否可見。
更新 UI
接下來我們在定義一個Update函式,來更新我們的UI要怎麼設定。
function TextShadow:Update():這一行定義了一個叫做Update的方法,該方法用於更新TextShadow物件的 UI。local arg = self.SetArg:這一行將self.SetArg表示的陰影設置參數儲存在本地變數arg中,以便於後續使用。local setting = {...}:這一行創建了一個名為setting的表,其中包含了陰影效果的設定。對於每個 UI 元素(back 和 front),設置了相應的位置(x 和 y)、顏色(r、g、b 和 a)等參數。for k,v in pairs(self.UI) do:這一行使用pairs函數遍歷self.UI表中的所有元素,其中 k 是鍵(back 或 front),而v則是相應的值(UI.Text 物件)。- 在迴圈中,創建了一個名為
temp的表,用於存儲更新後的 UI 參數。這些參數包括了位置 (x 和 y),大小 (width 和 height),顏色 (r、g、b 和 a),以及文本相關的屬性(text、font、align)。 v:Set(temp):這一行調用了 UI.Text 物件的Set方法,並將更新後的參數temp傳遞給該方法,從而更新了 UI 的屬性。
總的來說,這段程式碼是用來更新 TextShadow 物件的 UI,並根據設置的參數來更新相應的屬性,例如位置、大小、顏色等。這樣一來,可以在程式執行過程中動態地改變陰影效果的外觀。
來自 ChatGPT 說明
1 | -- 更新UI |
上述程式碼定義了一個 Update 方法,用於更新 TextShadow 物件的 UI。該方法根據設定參數更新 UI 的各個屬性,包括位置、大小、顏色等。
其他必需的函式
function TextShadow:Set(args):這一行定義了一個名為Set的方法,該方法用於設置陰影效果的屬性。首先,它檢查傳入的參數是否為一個表,如果是的話,則調用setArgs函數將該表中的值設置到self.SetArg中。最後,它調用了self:Update()方法來更新 UI。function TextShadow:Get():這一行定義了一個名為Get的方法,該方法用於取得陰影效果目前的設置值。它調用了clone函數來複製self.SetArg表,以防止直接返回引用。function TextShadow:Show():這一行定義了一個名為Show的方法,該方法用於顯示陰影效果的 UI。它調用了deepCall函數來遞迴地調用 UI 表中每個元素的Show方法,以顯示相應的 UI。最後,將self.visible設置為 true,表示陰影效果已經顯示。function TextShadow:Hide():這一行定義了一個名為Hide的方法,該方法用於隱藏陰影效果的 UI。它同樣調用了deepCall函數來遞迴地調用UI表中每個元素的Hide方法,以隱藏相應的 UI。最後,將self.visible設置為 false,表示陰影效果已經隱藏。function TextShadow:IsVisible():這一行定義了一個名為IsVisible的方法,該方法用於返回陰影效果是否可見的狀態。它簡單地返回self.visible的值,以表示陰影效果目前是否處於顯示狀態。
總的來說,這些方法為 TextShadow 物件提供了設置、取得、顯示和隱藏陰影效果的功能,並提供了一個方法來查詢陰影效果目前是否可見。
來自 ChatGPT 說明
1 | -- 設置 |
上述程式碼定義了一些必需的函式,包括設置、取得設定值、顯示、隱藏和返回顯示狀態等功能。這些函式使得 TextShadow 物件更加易用和靈活。
輔助函式
local function setArgs(data, args):這是一個局部函數,用於更新表中的值。它接受兩個參數,data表示待更新的表,args表示包含新值的表。該函數通過遍歷data表中的每個鍵,檢查是否存在相應的 args 表中的值,如果是的話,則將data表中的值更新為args表中的對應值。如果鍵對應的值是一個表,則遞迴調用setArgs函數以處理嵌套的表。local function deepCall(table, funcName, args):這是一個局部函數,用於在表中深層遞迴地調用指定的函式。它接受三個參數,table表示待遍歷的表,funcName表示要調用的函式名稱,args表示要傳遞給該函式的參數。該函數遍歷table表中的每個元素,如果元素是一個表,則遞迴調用deepCall函數以處理嵌套的表;如果元素是一個 userdata,則調用該 userdata 對象的指定函式,並傳遞參數args。local function clone(table):這是一個局部函數,用於深層複製表。它接受一個表作為參數,並返回該表的深層複製。該函數遍歷原始表中的每個鍵值對,如果值是一個表,則遞迴調用自身以處理嵌套的表;否則,將鍵值對直接複製到新的表中。
這些輔助函數提供了對表的操作,使得程式碼更加模組化和易於理解。通過這些函數,可以更方便地處理複雜的數據結構和執行深層遞迴操作。
來自 ChatGPT 說明
1 | -- 更新設定值 |
上述程式碼定義了三個輔助函式,分別是更新設定值的 setArgs、深層調用的 deepCall 和複製表的 clone。這些函式用於處理表的操作,使得程式碼更加模組化和易於理解。
完整代碼
1 | -- 更新設定值 |
上述是完整的程式碼範例,展示了如何使用 Class 物件來建立自定義的文字陰影 UI 物件。這樣的設計使得程式碼更加模組化和易於理解,同時也提供了更好的可擴展性和重用性。