iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
Software Development

在麥塊的農場裡寫 Lua系列 第 24

Day24 麥塊裡的彩色大螢幕和 GIF 動畫

  • 分享至 

  • xImage
  •  

上一回介紹 CC: Tweaked Advanced Computer 各個面向與特色後
今天來玩更進階一點的應用

Pastebin 上傳分享程式碼

Pastebin 是很早期的線上純文字內容分享儲存服務,就我了解是 2002 開始的服務
雖說是純文字,但主要是程式碼的儲存與分享
它支援了非常多程式語言的關鍵字顏色與亮度設定
作為暫時的程式碼分享相當適合

為何要提 Pastebin 呢?因為 CC: Tweaked 也實作了 /rom/programs/http/pastebin.lua !!!
你可以透過這個 script,方便的上傳或下載 pastebin 程式碼
上傳你的程式碼,成功後回傳一組 key

pastebin put receiver.lua

下載已上傳的程式碼,並儲存成自訂的檔案名稱

pastebin get 5uk9uRjC GIF

下載已上傳的程式碼,並直接執行,最後面可接參數

pastebin run 5uk9uRjC myfile.gif

另外還有一個 /rom/programs/http/wget.lua
我想這兩個 script 應該已經大大滿足需要從網路取得程式碼的需求
也許大家可以試試從 github 下載

在 Advanced Monitor 大螢幕上貼圖

在網路上找到一些有點威的 lua library
可以貼上靜態圖,甚至還可以做小動畫,有點不可思議@@
兩個網址如下,大家可先參考
http://www.computercraft.info/forums2/index.php?/topic/25354-cc-176-blittle-api/
https://www.youtube.com/watch?v=iBk7KpjfriE

參考程式碼如下,我直接把一部分說明寫到程式碼註解

-- 這部分也許有 bug,或是版本衝突,不知道為何需要 bbpack 也需要 package,少了任何一個執行都會有問題
if not fs.exists("bbpack") then shell.run("pastebin get cUYTGbpb bbpack") end
if not fs.exists("package") then shell.run("pastebin get cUYTGbpb package") end
if not fs.exists("GIF") then shell.run("pastebin get 5uk9uRjC GIF") end
if not fs.exists("blittle") then shell.run("pastebin get ujchRSnU blittle") end

-- 下載後直接載入 API
os.loadAPI("GIF")
os.loadAPI("blittle")

-- CC: Tweaked 電腦最多 16 色,沒辦法真的呈現豐富的圖檔,所以定義遇到 GIF 的透明背景時,要轉換的顏色,這裡定義是白色
local fileName, backgroundColor = "cat.gif", colours.white
-- 我的超級大螢幕
local mon = peripheral.wrap("monitor_5")

mon.setTextScale(0.5)
mon.setBackgroundColour(backgroundColor)
mon.clear()

local x, y = mon.getSize()

-- 載入 GIF 靜態圖
local image = blittle.shrink(GIF.toPaintutils(GIF.loadGIF(fileName)), backgroundColor)
blittle.draw(image, math.floor((x-image.width)/2)+1, math.floor((y-image.height)/2)+1, mon)

其實最後的 load gif 的部分,我沒有深入,也看沒懂 XD
但大概知道是載入 GIF 格式檔案後,會將顏色作轉換成 Advanced Monitor 可以顯示的 16 色
直接來看結果,是不是超帥的^^
CC: Tweaked Advanced Monitor load gif

不過這部分只是把 GIF 當成靜態圖來顯示,並沒有動畫
所以理論上,我要顯示 PNG or JPG 應該都是可以的?
經過實測,其他格式圖檔當然就不能用 GIF 函式庫處理,合理
所以我用 CC: Tweaked 內附的 paintutils.loadImage(string path) 來試著載入 PNG, JPG
但呈現結果滿糟的
不是圖檔太大,就是完全看不出原圖,我想是顏色的轉換需要再處理過

在 Advanced Monitor 大螢幕上跑 GIF 動態圖

要讓 GIF 在大螢幕上動起來,還真的可以!辦得到!
換以下的程式碼即可,不過實測結果,縮放比例總是沒辦法達到預期

local gifs = fs.find(fileName)
local x, y = mon.getSize()

while true do for i = 1, #gifs do
    local img = GIF.loadGIF(gifs[i])
    mon.setBackgroundColour(backgroundColor)
    mon.clear()

    parallel.waitForAny(
        function ()
            GIF.animateGIF(img, math.floor((x - img.width) / 2) + 1 , math.floor((y - img.height) / 2) + 1, mon)
        end,
        function ()
            sleep(1)
        end
    )
    end   
end

這裡的 parallel 是 /rom/apis/parallel.lua
也是 CC: Tweaked 內附的 API,用來模擬多執行緒
parallel.waitForAny 讓多個函數模擬多工的原理是,每當有函數執行 yield()、os.pullEvent() 、其他任何會暫停的語法,或是執行結束,都會自動切換到下一個函數去執行

Advanced Monitor 的分享到這,雖然還無法窺其原理與奧妙
但已經為麥塊增添許多樂趣~


上一篇
Day23 CC: Tweaked 升級版的電腦
下一篇
Day25 在麥塊用手持式電腦玩魔術方塊
系列文
在麥塊的農場裡寫 Lua30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言