LV. 12
GP 36

【攻略】Studio模式 [Lua]CSO API 進階應用 (請用電腦觀看)

樓主 牛舌餅 quack12865
GP29 BP-
在第一篇有講到關於CSO API的用法
而對於雖然有接觸過程式設計經驗,甚至是有學過Lua的人
剛接觸此API時也會很吃力,因為對於最終的成果詳細狀況都不清楚
(例如說明此API的網站上有說某個函式能畫正方形,不過,畫在哪裡?畫出來的狀況怎樣?)
要如何發想創意?
因此這張我將詳細解說一些常用的應用。

正題:
看到官方提供的API,一堆"工具"能用,不知道要從哪裡下手?
雖然在上一張我整理了一些常用的函式,但是我相信初學者還是不知從何開始用。
因此在這裡示範一些常用的應用。
在此教學中,會著重在觀念、想法的講解,也會帶一些基本的Lua。
一開始,會先講解UI部分的應用,再來是Game方面的應用,之後會兩個部分融合應用。

請注意:這章所講解的主要是一些常用的應用,而不是在講解此CSO API


教學前你所需要具備的能力:
1.至少寫過一種語言(如:C C++ JAVA Python JavaScript.........等)
2.知道此CSO API常用函式的作用

目錄:
        單元一   做出一個夜視鏡-1(UI)
        單元二   做出一個夜視鏡-2(UI)
        單元三   傳送(Game)
        單元四   特定玩家區分(Game)
        單元五   經過顯示字串(UI Game)
        單元六   單人回傳(UI Game)

單元一   做出一個夜視鏡-1
在這個單元裡面,我會先實現讓亮度變低,以提升需要夜視鏡的需求。
如何讓亮度變低?在目前的技術下只能讓整個螢幕(screen),用一個大黑色矩形(有些透明)蓋住。
再來,這個單元有關"介面",因此從UI下手。
第1行:把 UI.ScreenSize() 存在 full 變數裡,在第7 8行裡有使用到這個變數,UI.ScreenSize() 有兩個方法(method)一個是 width,一個是 height,分別拿到螢幕解析度的寬高。
第2行:創建一個畫圖的地方,並放到 black 變數裡。
第3行:對 black 設定。
第12行:讓透明度在大約適中,以達到效果。

單元二   做出一個夜視鏡-2
在這個單元裡面,我會實現按下F能開啟夜視模式。
第1行:寫出這個函式,以偵測按下F(第二行裡的UI.KEY.F)的動作。
第2行:如果有人按下F,則 inputs[UI.KEY.F]為true
第3行:更改 black 的設定。

單元三   傳送
這個單元有關"遊戲"(傳送),因此從 Game 下手。
我們要實現經過某個位置時,就傳送他到另一個位置。
才短短4行,卻包含很多意義。
第1行:讓Lua知道一個觸發方塊的位置(位於(0,0,0))。
請注意:如果你測試有錯,請檢察你寫的座標上有無觸發方塊。
第2行:
1.檢測指定位置的人有無通過(範例為convey)。
2.參數 player 為"通過的人"的 userdata (為一個Object),你成功的"抓到"了這個 userdata ,就能更改這個玩家的數值了。請注意:以這幾行來說,就只有經過時,能抓到此userdata。亦即,如果你用OnUpdate去寫第3行的內容,電腦就會因為抓不到player這個userdata物件而錯誤。
3.更改"此"通過的玩家的座標(位置)。

單元四   特定玩家區分
以第三單元為例,如果需要特定的人通過才有反應的時候,該怎麼辦?
很簡單,加個判斷式:
第3行:如果通過的人的名字為"牛舌餅",就傳送。

一般當然不是這樣用,通常都是例如有人破完任務後才有資格傳送,直接用名字的話就沒有判斷的意義了,因為一開始你不知道誰破了任務,不過這只是個範例。不過這代表了如果我們用其他的方式去分辨玩家,也能達到一樣的效果。例如把破完任務的人的索引值(index)加到一個表(table)裡等.......。至於如何做出最有效率、方便的判斷方法,就是個人的功力了。

元五   經過顯示字串
有個需求:玩家經過一個觸發方塊後,所有的人顯示字串。
為何會在目錄的此項目中的括號裡會寫上(UI Game)?
這是因為這牽涉到兩個領域的地方,這個示範非常重要,請務必弄懂。
兩個領域:
UI:講到顯示,有關"介面",因此,寫在UI裡。
Game:講到"經過",有關"遊戲",因此,寫在Game裡。
遇到這種需求時,請先弄清楚先後觸發順序。
在這個示範中,是先"經過"再"顯示"
因此是Game-->UI
第一章講到UI-->Game能用signal,但是現在需求不是這樣,那怎麼辦?
用sync。
左邊為Game.lua,右邊為UI.lua。
邊:
第3行:創建一個名為 test 的同步變數,專門檢測用,初始值為0(第4行)
第5行:創建一個位置,座標為(0,0,0)。
第6 7 8行:如果有人經過這個位置,test 變數的值改為1。
邊:
第4 5行:創建一個名為 test_1 打字區域並設定。
第10行:先隱藏以便之後顯示。
第11行:當 test 同步時(包括改變值(value),範例是0-->1),呼叫這個函式。
第12行:如果這個值為1,就顯示 test_1

請注意:如果只是這樣寫,隨便"一個玩家"經過,"所有玩家"都會顯示 test_1,通常我們不會想這樣,通常我們會想要只有通過的人顯示,如何達成?下一個單元會詳談如何做到。

單元六   單人回傳
這個是一個非常重要的觀念。
有個需求:玩家經過一個觸發方塊後,只有"經過的人"顯示字串。
這需求看似簡單,但是仔細想想就會發現哪裡不對。
原本只照單元五這樣做,會是全部的人顯示。那該如何避免?
一樣,左邊為Game.lua,右邊為UI.lua。
仔細比對單元五跟單元六,會發現各只有一行改了,就是UI.lua的第12行及Game.lua的第7行。
左邊:
第7行:讓同步變數的值改成通過玩家的索引值(index),讓UI檢測用。
右邊:
第12行:如果傳回來的索引值等於自己的,就顯示。

把判斷式改成用玩家索引值判斷,就能解決這個問題。因此,請注意有個上一章節的重點:Game是管全體,UI管個人,要Game給訊號,不可能只給單人,不然他要給誰?
因此還要加個判斷式去判斷那個同步變數"暫時"是屬於誰的。
UI能直接用 UI.Signal() 傳訊號的原因是,只有Game要傳。
示意圖:

以上就是CSO API進階應用教學,希望這教學會讓想上手Lua的人更熟悉它的用法。
致 願意學習的你
29
-
LV. 10
GP 0
2 樓 月影 F130646387
GP0 BP-
請問一下大大,單元四特定玩家區分,玩家名稱是中文的話,是不是無效啊
0
-
LV. 10
GP 0
3 樓 月影 F130646387
GP0 BP-
請問一下大大,單元五經過顯示字串,要如何實現...
我照著教學做一直出現錯誤,確定座標有觸法方塊
0
-
LV. 4
GP 73
4 樓 夜影o夜空 amya800800
GP0 BP-
那個,請問如果地圖套用了LUA之後,會跟帳號所設置的鍵位有衝突嗎??

因為之前我認識的陸服好友有幫我寫出一套仿CSO2行屍走肉介面的LUA ,但是我跟我朋友經過測試的時候發生了問題,就是有改過鍵位跟沒改過鍵位的帳號所測試的結果不一樣

有改過鍵位的(我朋友):
按下N會關閉功能介紹跟跑出夜視鏡、按下L跑出道具使用欄跟自動補血


沒改過鍵位的(我):
按下N只會關閉功能介紹、按下L只會開啟自動補血
0
-
未登入的勇者,要加入 5 樓的討論嗎?
板務人員:

3612 筆精華,10/15 更新
一個月內新增 4
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】