pcall, xpcall, debug
今天我想來玩玩麥塊的喇叭,然後再繼續探索 Lua 的語法
在麥塊裡面,我們本來就可以透過 playsound 指令播放各種音效
例如播放牛牛的哞哞叫
/playsound minecraft:entity.cow.ambient block @a ~ ~ ~ 1 1
詳細指令語法可參考 麥塊 playsound
CC: Tweaked 工具箱的 Speaker,就提供我們用程式化的方式來播放音效
會更有彈性
和電腦組裝的方式,跟磁碟機一樣,可接在電腦任何方位
如圖,我將喇叭接在電腦右方
Speaker 也是電腦的週邊設備,跟 Disk Drive, Monitor 一樣
目前看來 CC: Tweaked 的設計就是
這些週邊設備都必須透過 peripheral.wrap 包裝後使用
方法的參數跟麥塊本身的 playsound 指令非常像
最後面也是音量 0 ~ 1,音調 0 ~ 2
peripheral.wrap('right').playSound('minecraft:entity.cow.ambient', 1, 2)
除了各種環境、動物、動作音效外,Speaker 也可以播放各種樂器聲音
這部分就像是麥塊的音階盒一樣
例如這是播放吉他的聲音
peripheral.wrap('right').playNote('guitar', 1.0, 1.0)
第一個參數當然就是樂器種類了
可以播放的樂器參數有 "harp", "bass", "snare", "hat", "basedrum", "flute", "bell", "chime", "guitar",這部分是透過 help speakers 查詢得知
第二個參數是音量大小,一樣也是 0 ~ 1
第二個參數是音調高低,也就是可以透過高低音來演奏 Do Re Mi Fa So ...
實測數值是落在 0 ~ 24,數字再調上去的聲音就都一樣了
然而如果連續播放
會發現電腦幾乎同一時間執行
導致聲音都夾雜在一起了
可以故意設個停留時間
for i = 1, 10, 1 do
peripheral.wrap('right').playNote('flute', 1.0, i)
sleep(0.5)
end
這邊的 sleep 是 bios.lua 定義的函數,也是 CC: Tweaked 寫好可直接呼叫的
接下來我想繼續看錯誤處理,這在上一回已經簡單介紹過 pcall 語法
有著其他語言 try catch 的作用,可避免程式意外結束
pcall 就是 protected call 的意思
status, value = pcall(f, arg1, ...)
另外有個 xpcall,不一樣的地方就是可以傳入一個 message handler
定義如下
status, value = xpcall(f, msgh, arg1, ...) end
直接看範例,中間的 message handler 函數可自訂,這裡我直接用 Lua 的 debug 函式庫
當發生錯誤時,會自動呼叫 message handler
div = function(a, b)
return a / b
end
ok, result = xpcall(div, debug.traceback, 10, "abc")
print(ok)
print(result)
上述的錯誤訊息大概長這樣,我們可以透過 debug.traceback 知道指令大概的執行流程
以及錯誤細節
false
input:2: attempt to div a 'number' with a 'string'
stack traceback:
[C]: in metamethod 'div'
input:2: in function 'div'
[C]: in function 'xpcall'
input:5: in main chunk
[C]: in function 'pcall'
demo.lua:60: in main chunk
[C]: in ?
今天的研究就到這裡,下次來玩印表機吧!