圖元與邏輯

主要介紹在CraftLand中圖元編輯器與圖元相關的概念。

圖元方塊概述

我們在編輯圖元時需要觀察每一個圖元方塊的形狀,我們要做的就是將這些方塊遵循固定的規則拼接在一起。

基本操作

我們要進入圖元編輯器之前首先要打開一個腳本,打開CraftLand,左上角選項中點擊【More】,再點擊【Block Script】,進入圖元編輯器預設我們會打開’全域腳本。
image-20241031110011453

介面介紹

進入到圖元編輯器以後,在編輯器介面一共有4處值得我們注意的區域,如下圖所示。 SeaTalk_IMG_20241031_113903

序號 圖示 描述
1 image-20241031114641450 在介面左上角的是一個搜尋框,因為圖元方塊數量龐大,我們可以在搜尋框中透過輸入關鍵字的方式檢索到我們想要的圖元方塊。
2 image-20241031114811375 在介面右上角是腳本選擇列表,點選右側icon會出現下拉選項,顯示目前已有的腳本。全域腳本為預設創建。
3 image-20241031173408111 我們將圖元一共分為了6個分類,我們可以點擊分類圖示來展開圖元方塊清單
4 image-20241031114830172 按鈕可撤銷上一步。右側圖示為恢復按鈕,可恢復上一步驟撤銷的操作

放置圖元

1.拖出方塊:在了解了界面以後,我們首先打開左下角分類中的第一個分類,從中選擇一個圖元方塊並將他拖出到空白處作為我們邏輯的起點![image-20241031171419878](https: //dl.dir.freefiremobile.com/common/OB46/CSH/OfficialWeb/CLWiki2/4_Block/image-20241031171419878.png)

2.連接方塊:我們在從圖元列表中選擇一個上方有凹陷的圖元方塊,會發現當把圖元方塊拖到起始方塊下方時起始方塊下方凸起處有黃色UI提示,此時我們鬆開手指就會發現兩個方塊會自動吸附到一起,那麼我們就已經完成了一個簡單的邏輯。 image-20241031171627914

3.填入資料:首先我們將圖元方塊中的資料拖出或在圖元清單中拖出適當的資料類型。

image-20241031174335831

然後在將資料方塊拖曳到對應的資料空格中,會有黃色UI提示框顯示在資料空格內代表當前方塊類型可以被放置,在鬆開手指時資料方塊會自動吸附進空格內。 image-20241031175503431

注意:當填滿的資料類型與空格內的資料類型不一致時,編輯器會有一個明顯的提示並且將不符合類型的資料方塊自動彈出。

image-20241031183111256

4.拆解方塊當我們移動已經連接在一起的多個圖元方塊中的其中一個方塊時,會將該方塊下方連接的所有方塊一起帶走。

image-20241031182555866

5.刪除方塊:按住任意圖元方塊時在介面的右側會出現一個’垃圾桶’,我們將想要刪除的圖元方塊移動至垃圾桶既可以刪除該圖元方塊。

image-20241031182311721

當然,我們也可以同時拖曳多個方塊到’垃圾桶’來同時刪除多個方塊

image-20241031183322347

形狀

方塊描述 圖示
只有下方凸起的的方塊為一段邏輯的起點。 image-20241030185836296
只有上方凹陷的方塊一般為一段邏輯的終點。 image-20241030185844004
若上方既沒有凹陷,下方也沒有凸起,則說明這一個方塊為一段數據,它可以被應用於其他方塊中,作於一些邏輯運算的一個參數。 image-20241030185856813
若方塊既有上方凸起也有下方凹陷,表示該方塊為既可以連結其他的下方有凸起的方塊也可以在它的下方繼續連結更多的方塊,可以是一段邏輯的一個節點。 image-20241031101239718
在方塊分類裡我們會發現一個形狀比較特殊的方塊,這個特殊形狀的方塊是一種條件表達式,分為外部的凸起和凹陷和內部的凸起和凹陷。我們可以像連接其他方塊一樣的在條件表達式方塊的外部凸起和凹陷上正常連接其它方塊,也可以在條件表達式的內部鏈結方塊,而在它的內部所編寫的邏輯需要滿足某個條件邏輯才會進行運算。 image-20241031101800841

分類

在圖元編輯器中我們為了能夠更有效率的找到所需的方塊,所以我們將方塊分成了7個類型。

如下圖所示:

類型 圖示 概述
Incident SeaTalk_IMG_20241030_143100 事件類型:一般作為一段邏輯開始的時間點,我們在編寫圖元邏輯時首先需要明確這一段邏輯我們想讓他在哪一個時間節點時觸發,例如當玩家復活時我們想給他發把槍或當回合開始時我們想在地圖中心放置一個空投補給箱,那麼’當玩家復活時’和’當回合開始時’就是我們這段節點所需要的時間節點。
Entity SeaTalk_IMG_20241030_143101 實體類型:是CraftLand中的一個重要概念(詳見’重要概念’)在圖元編寫中我們經常會去調用或是改變一個實體的屬性。
遊戲 SeaTalk_IMG_20241030_143105 遊戲類型:在Game類型中我們為CL的創作者提供了許多常用的功能,這些功能通常是一些遊戲中常常會需要調整的設置,這些功能也與遊戲玩法有非常大的關聯,如創建一個怪物、改變天空盒或是加入語音頻道。
Data SeaTalk_IMG_20241030_143106 資料型態:資料方塊可以是大部分邏輯運算時所需要用到的參數,它可以是一段資料被用在其他方塊中,也可以是一段運算來計算某一個值。
Logic SeaTalk_IMG_20241030_143109 邏輯類型:在邏輯類型中我們提供了多個複雜的邏輯運算,這一類邏輯運算常常在處理資料時被使用,它可以根據特定的條件對資料進行篩選、判斷或決策。例如,判斷一個數字是否大於另一個數字,從而決定採取不同的動作。
Variable SeaTalk_IMG_20241030_143111 變數類型:在變數類型中,我們可以自行建立變量,透過該方式建立的變數為腳本變量,用於目前腳本資料處理。在其他腳本中可以透過外部引用的方式取得並設定該變數。
Function SeaTalk_IMG_20241030_143113 我們創建的自訂事件可以將部分邏輯封裝起來,使得邏輯更加清晰、易於理解和維護。

邏輯圖元方塊說明

方塊名詞 圖示 描述說明
Conditional statements…else(if…else語句) image-20241104111959461 滿足條件則運行IF下的節點
Conditional loop(while語句) image-20241104112010284 滿足條件則運行IF下的節點,不符合條件則運行ELSE下方節點。
Loop of integer rage(for index語句) image-20241104112033968 參數i從最小值開始,每運行一次下方節點則i增加步進值,直到i大於等於最大值。
Loop every element(for each語句) image-20241104112043683 對於參數清單/字典中的每一個KEY,執行一次下方的節點。
Check null image-20241104112050652 檢查是否為空值,對空值進行適當處理,避免產生報錯。
Continue to next image-20241104112056253 跳過本次循環,進入循環體的下一個循環。
Break loop image-20241104112103316 中斷循環,繼續執行循環體後的節點。

什麼是ECA?

在代碼相關的脈絡中,ECA(Event-Condition-Action)通常指的是一種規則表示方法。

一、組成部分

  1. 事件(Event)
  • 觸發規則執行的特定情況或發生的事情。例如,玩家進入遊戲、玩家造成殺戮或玩家離開了遊戲。

範例:玩家造成了擊殺,觸發該事件後玩家獲得100金幣

SeaTalk_IMG_20241101_114133

  1. 條件(Condition)
  • 當事件發生後,對是否執行後續動作進行判斷的邏輯表達式。只有當條件為真時,才會執行對應的動作。例如,如果殭屍數量小於10則創建殭屍、如果玩家數量等於1則獲得加特林或如果玩家座標等於某個值則傳送玩家到另一個座標。

範例:當玩家加入遊戲時如果他正開著麥克風那麼他的名字就會變成’我有麥克風’

SeaTalk_IMG_20241101_143623

  1. 動作(Action)
  • 如果事件發生且條件滿足,就會執行的具體操作。可以是修改資料、呼叫函數、發送訊息、觸發另一個事件等。

範例:回合開始給玩家一把AK47,並且將玩家血量設定成500

SeaTalk_IMG_20241101_145943

ECA中的重要概念

概念名 說明
函數 函數(通常稱為方法)是一段可重複使用的程式碼區塊,用於執行特定的任務。函數將特定的操作或任務封裝在一個獨立的方法區塊中,使得運算和邏輯更加模組化和易於維護。外部程式碼可以透過呼叫函數來執行特定的任務,而無需了解函數內部的實作細節。
參數 參數是在函數或方法呼叫時傳遞給它們的值,包括形式參數和實際參數,可分為參數類型,用於提供靈活性和進行資料傳遞等。
枚舉 枚舉是常數資料集合的概念,例如一個攻擊方式枚舉,它內部可以包含近戰、射擊、爆炸等選項。不同的枚舉類型之間無法互相賦值,即便它們的值可能一樣,因語意不同而無法賦值。

自訂事件&自訂變數

自訂事件

在圖元編輯器的左下角,我們總共可以找到七種類型的圖元列表,其中在功能類型中我們可以點擊【CREATE FUNCTION】建立自訂事SeaTalk_IMG_20241101_150402

SeaTalk_IMG_20241101_150359

自訂事件介面概述

序號 圖示 描述
1 image-20241101151951739
2 image-20241101151917848 點擊加號可以為自訂事件新增一個內部參數,該參數只能在所屬的自訂事件中使用
3 image-20241101151927435 點擊右下角加號可以為我們的自訂事件新增一個回傳值,當我們在其他演算法邏輯中呼叫該事件,就可以得到我們想要的資料

自訂事件說明

在圖元編輯時我們會將多個圖元方塊整合在一個自訂事件中,我們也可以說這是我們將多個運算邏輯封裝在一個方法中,我們這麼做會有幾點好處:

1.清晰的命名:使用封裝的事件我們可以不需要閱讀複雜的圖元方塊邏輯,只需要透過命名就可以理解這一整個事件邏輯意圖

2.簡化圖元結構:將複雜的計算封裝在自訂事件中,可以使主結構的邏輯更加簡潔明了,降低圖元結構的複雜度,提高可讀性。

2.復用:當多個圖元邏輯區塊需要相同的運算時,可以復用這個封裝好的自訂事件,避免重複編寫相同的圖元邏輯,不僅如此在我們修改和維護這個自訂事件時,就可以同時修改多處復用該自訂事件的圖元邏輯區塊,避免在多個地方重複修改相同的程式碼。

自訂變數

自訂變數介面概述

在圖元類型清單中我們選擇【VARIABLE】類型,再點選【CREATE VARIABLE】就可以建立自訂變數

image-20241101162644288

在建立自訂變數時我們可以設定變數的名稱以及變數的資料類型

image-20241101162620704

自訂變數說明

我們在編寫圖元邏輯時有時可能需要根據特定需求自行定義資料類型的參數變量,而自訂變數功能則是解決了這一需求。

創建的變數也可以在不同的方法之間傳遞資料。透過將資料儲存在變數中,可以將其作為參數傳遞給其他方法,或從一個方法傳回給呼叫者。

自訂事件/變數範例

我們會建立一個邏輯來示範如何在圖元編輯器中使用自訂事件和自訂變數

範例邏輯:當玩家造成擊殺時,玩家的血量上限就會減少10點,最小減少到20

1.首先我們建立一個命名為’CurrentMaxHp’的自訂變數並將資料類型設為’int’,同時再建立一個命名為’DecreaseMaxHp’的自訂事件作為前期的準備工作SeaTalk_IMG_20241101_175 037

SeaTalk_IMG_20241101_175059

2.找到並拖出’當玩家造成擊殺’事件,並連接剛剛創建的自定義事件’DecreaseMaxHp’,連接後我們就完成了當玩家擊殺後減少玩家生命值上限的邏輯基礎SeaTalk_IMG_20241101_183151

3.完成了基礎邏輯以後,我們就可以開始寫自訂事件的圖元結構。首先,我們將剛剛建立的變數賦值SeaTalk_IMG_20241101_183704

4.接著,連接一個演算法,讓變數每次觸發事件後數值-10SeaTalk_IMG_20241101_183713

5.新增生命上限最小值,加入判斷如果當前的生命上限小於等於20,則當前生命上限等於20SeaTalk_IMG_20241101_183808

6將我們計算好的變數重新賦值給玩家的生命上限屬性,到此為止我們就完成了所需的全部邏輯。 SeaTalk_IMG_20241101_183902

7.驗證![SeaTalk_IMG_20241101_184513](https://dl.dir.freefiremobile.com/common/OB46/CSH/OfficialWeb/CLWiki2/4_Block/SeaTalk_IMG_20241101_184513

生命上限正確減少,驗證無誤。 image-20241101184737595