Day23 CC: Tweaked 升级版的电脑

我围绕在「基本版」电脑已经二十多天了 ...
一开始先试着熟悉 Lua 语法,接着玩转电脑周边设备,最後是网路架设
电脑的基本功能大概熟个十之八九了~
今天来让电脑升级吧!
升级公式如下,你只要有满满的黄金,就可以有强大的电脑,这真是直白乾脆 XD
CC: Tweaked Advanced Computer

玩过一番之後,归纳 Advanced Computer 的几个特点如下:

  1. 彩色萤幕
    虽然颜色没有很多,但是单色变彩色还是让人开心啊!
  2. 支援滑鼠
  3. 支援背景执行,可同时跑多个程序
  4. shell 视窗支援页签,可切换
  5. 在编辑视窗可直接执行

以下逐一介绍探索~

Advanced Computer 彩色萤幕与滑鼠

这部分的体验,直接执行 paint 小小画家即可,这也是 CC: Tweaked 预先设计好的小程序
位置在 /rom/programs/fun/advanced/paint.lua

paint mypicture

有大约 16 个颜色可选择,滑鼠点右下角可切换色笔和橡皮擦
来展现一下我绘画的功力 ......
CC: Tweaked Advanced Computer paint
................
不过它储存後,不是真的变成图档,而是副档名 nfp 的纯文字档
CC: Tweaked Advanced Computer paint save file

关於滑鼠的支援,还有一个是 CC: Tweaked 设计好的小品游戏
位置在 /rom/programs/fun/advanced/redirection.lua
直接输入即可开始游玩

redirection

这里顺便介绍,Advanced Computer 因为支援滑鼠功能,也相对有滑鼠相关事件
mouse_click, mouse_drag, mouse_up 这三个事件发生时,都可取得 button, x 座标, y 座标
mouse_scroll 则是滑鼠滚轮事件,可取得方向 direction 和 x 座标, y 座标
这部分在 paint.lua 和 redirection.lua 都有直接的应用可参考

Advanced Computer 页签与多工执行

多页签的支援,是来自 /rom/programs/advanced/multishell.lua
判断的部分则是在
bios.lua #977

-- Run the shell
local ok, err = pcall(parallel.waitForAny,
    function()
        local sShell
        if term.isColour() and settings.get("bios.use_multishell") then
            sShell = "rom/programs/advanced/multishell.lua"
        else
            sShell = "rom/programs/shell.lua"
        end
        os.run({}, sShell)
        os.run({}, "rom/programs/shutdown.lua")
    end,
    rednet.run
)

而背景与前景执行的部分,则可以使用 bg.lua 和 fg.lua
位置也是在 /rom/programs/advanced/
例如

bg gps locate

这样就会自动开启一个新的 Tab 去执行 GPS 定位,参考画面如下
CC: Tweaked Advanced Computer background tabs

来顺便看看 bg.lua 和 fg.lua 程序码
bg.lua

if not shell.openTab then
    printError("Requires multishell")
    return
end

local tArgs = { ... }
if #tArgs > 0 then
    shell.openTab(table.unpack(tArgs))
else
    shell.openTab("shell")
end

fg.lua

if not shell.openTab then
    printError("Requires multishell")
    return
end

local tArgs = { ... }
if #tArgs > 0 then
    local nTask = shell.openTab(table.unpack(tArgs))
    if nTask then
        shell.switchTab(nTask)
    end
else
    local nTask = shell.openTab("shell")
    if nTask then
        shell.switchTab(nTask)
    end
end

从 bg, fg 原始码可发现,必须支援 multishell 才可以跑,因为基本版的电脑无法执行
再来就是,两个其实都是 shell.openTab
只是 fg 再多了个 shell.switchTab
所以事实上,它只是用 tabs 的视觉化来模拟前景和背景执行效果而已
你如果用 fg,仍然可以手动用滑鼠切换到原本的 tab

电脑怎麽知道要去哪找程序档,以及是否可以执行?

如果你仔细研究,会发现不管是 Computer、Advanced Computer、Pocket Computer、Turtle
事实上大家在 rom 里面放的程序码和档案都是完全一样的!
差别只在於预设搜寻程序的路径不同,或是有的程序可以执行,有的不行!

除了前面看过的 shell.openTab、term.isColour() 和 settings.get("bios.use_multishell")
我们再来看看
startup.lua #4

local sPath = ".:/rom/programs"
if term.isColor() then
    sPath = sPath .. ":/rom/programs/advanced"
end
if turtle then
    sPath = sPath .. ":/rom/programs/turtle"
else
    sPath = sPath .. ":/rom/programs/rednet:/rom/programs/fun"
    if term.isColor() then
        sPath = sPath .. ":/rom/programs/fun/advanced"
    end
end
if pocket then
    sPath = sPath .. ":/rom/programs/pocket"
end
if commands then
    sPath = sPath .. ":/rom/programs/command"
end
if http then
    sPath = sPath .. ":/rom/programs/http"
end
shell.setPath(sPath)
help.setPath("/rom/help")

sPath 变数就是我们直接输入指令的时候,电脑预设要搜寻的资料夹位置
就我所知,turtle、pocket、commands 实际的值会是空的 table
我猜这是在 Java 阶段就赋予的值,分别可代表 Turtle、Pocket Computer、Command Computer
term.isColor() 则代表则 Advanced Computer
因此,不同的工具在执行时,会自动在不同的路径搜寻,不会错乱

Advanced Computer + Advanced Monitor

Advanced Monitor 其实就是彩色版的萤幕,为了搭配 Advanced Computer
如果你将 Advanced Computer 接上基本版的萤幕,会发现无法在大萤幕上执行 paint 绘图
除此之外,接上大的 Advanced Monitor 之後,你甚至可以直接在大萤幕上作画
依靠的是萤幕本上的 monitor_touch 事件

这边我只给大家参考画面,请大家自行尝试了XD
CC: Tweaked Advanced Monitors

而因为电脑接了三台萤幕,各有不同的名称,我实际上执行的指令如下

bg monitor monitor_5 paint mypicture
bg monitor monitor_4 edit receiver.lua
bg monitor monitor_2 edit speaker.lua

今天分享到这里,谢谢大家收看~


<<:  CSS微动画 - 有始有终!心得跟最後动画分享

>>:  React Hooks - useRef

Day2 渗透测试流程与相关规范

渗透测试流程 与客户进行签约,取得合法的测试权限後,以下为签约与接洽需要注意: 企业是否了解渗透测...

AI 未来狂想

人的科技文明发展始终来自於人性 藉由现在的科技技术之发展,我们可以非常成熟的运用机器学习、深度学习及...

Day5:今天我们来介绍一下Microsoft Defender for Endpoint

适用於端点的Microsoft Defender 是一个平台,其设计诉求是要协助 企业网路预防、侦测...

Day27Java StringⅡ

接续昨天,来介绍第四种、第五种以及第六种方法! 4.代替Java String replace():...

JQuery 学习纪录 ( 6 )

这次非常久才发布学习纪录,因为最近当兵的关系,能学习的时间又被压缩了,但我还是会努力播出时间练习的。...