Day24 麦块里的彩色大萤幕和 GIF 动画

上一回介绍 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 的分享到这,虽然还无法窥其原理与奥妙
但已经为麦块增添许多乐趣~


<<:  【Day28】[演算法]-桶排序法Bucket Sort

>>:  Unity与Photon的新手相遇旅途 | Day24-Photon房间载入设定

[2021铁人赛 Day22] picoCTF 2019 Game 游玩介绍

引言 今天来介绍 picoCTF 2018, 2019 都出过的 CTF 游戏, 而 2018 的...

Day15:[搜寻演算法]Linear Search - 线性搜寻法

线性搜寻法可以说是最容易理解的搜寻演算法了,相信大家都有过类似的经验,在图书馆里想在书架上找一本书...

解决QEMU:Failed to open module: ........的问题

问题: 照着https://wiki.debian.org/QEMU 的教学 输入这两行指令没问题 ...

Day08-元件特性

元件是Vue最强大的功能之一,可以将重复的程序码封装,提高效率和维护性。 元件组织 把网页分成区块,...

Day 28 Compose UI ModalBottomSheetLayout

今年的疫情蛮严重的,希望大家都过得安好,今天疫情已经降级, 希望疫情快点过去,能回到一些线下技术聚会...