--这是一个简单的打印字符的程序,他使用下方url的字体进行显示 --因为字体文件超过cc存储大小所以使用网络加载字体 --通过printUtf8("字符",文字颜色,背景颜色)来达到类似 print的效果 --示例:printUtf8("你好世界! Hello Word!",colors.white,colors.lightGray) -- 从网络加载字库 local function loadRemoteFont(url) local response = http.get(url) if not response then error("无法连接到字体服务器") end if response.getResponseCode() ~= 200 then error("字体服务器返回错误: " .. response.getResponseCode()) end local content = response.readAll() response.close() -- 使用沙箱环境安全加载字体 local sandbox = {} local chunk, err = load(content, "=remoteFont", "t", sandbox) if not chunk then error("加载字体失败: " .. err) end local success, result = pcall(chunk) if not success then error("执行字体脚本失败: " .. result) end return sandbox.font or sandbox[1] or result end -- 字体URL local fontUrl = "https://git.liulikeji.cn/xingluo/ComputerCraft-Utf8/raw/branch/main/fonts/fusion-pixel-8px-proportional-zh_hans.lua" local font = loadRemoteFont(fontUrl) -- 显示单个字符的函数 local function displayChar(charMap, x, y, textColor, backgroundColor) -- 保存原始终端颜色设置 local origTextColor = term.getTextColor() local origBackgroundColor = term.getBackgroundColor() -- 设置新颜色 term.setTextColor(textColor) term.setBackgroundColor(backgroundColor) -- 遍历字符位图的每一行 for row = 1, #charMap do term.setCursorPos(x, y + row - 1) local line = charMap[row] -- 遍历行中的每个像素 for col = 1, #line do local byte = string.byte(line, col) -- 处理像素颜色 if byte < 128 then -- 背景色像素:反转颜色设置 term.setTextColor(backgroundColor) term.setBackgroundColor(textColor) term.write(string.char(byte + 128)) -- 转换为可打印字符 else -- 前景色像素:正常颜色设置 term.setTextColor(textColor) term.setBackgroundColor(backgroundColor) term.write(string.char(byte)) end end end -- 恢复原始颜色设置 term.setTextColor(origTextColor) term.setBackgroundColor(origBackgroundColor) end -- 显示UTF-8字符串的函数 local function displayUtf8String(str, font, x, y, textColor, backgroundColor) -- UTF-8解码器(简化版) local function utf8codes(str) local i = 1 return function() if i > #str then return end local b1 = string.byte(str, i) i = i + 1 -- 单字节字符 (ASCII) if b1 < 0x80 then return b1 -- 双字节字符 elseif b1 >= 0xC0 and b1 < 0xE0 then local b2 = string.byte(str, i) or 0 i = i + 1 return (b1 - 0xC0) * 64 + (b2 - 0x80) -- 三字节字符(中文) elseif b1 >= 0xE0 and b1 < 0xF0 then local b2 = string.byte(str, i) or 0 i = i + 1 local b3 = string.byte(str, i) or 0 i = i + 1 return (b1 - 0xE0) * 4096 + (b2 - 0x80) * 64 + (b3 - 0x80) else -- 不支持的编码,返回空格 return 32 end end end local cursorX = x -- 遍历字符串中的所有字符 for code in utf8codes(str) do -- 获取字符位图 local charMap = font[code] if not charMap then -- 如果字库中没有该字符,使用空格代替 charMap = font[32] or {{"\x80"}} -- 空格字符 end -- 显示字符 displayChar(charMap, cursorX, y, textColor, backgroundColor) -- 移动到下一个字符位置 cursorX = cursorX + #charMap[1] end end local cursorX, cursorY = 1, 1 local fontHeight = #font[32] -- 获取字体高度(使用空格字符) -- 自定义打印函数(带自动换行和滚动) local function printUtf8(str, textColor, backgroundColor) local width, screenHeight = term.getSize() -- 获取终端尺寸 -- UTF-8解码器 local function utf8codes(str) local i = 1 return function() if i > #str then return end local b1 = string.byte(str, i) i = i + 1 if b1 < 0x80 then return b1 elseif b1 >= 0xC0 and b1 < 0xE0 then local b2 = string.byte(str, i) or 0 i = i + 1 return (b1 - 0xC0) * 64 + (b2 - 0x80) elseif b1 >= 0xE0 and b1 < 0xF0 then local b2 = string.byte(str, i) or 0 i = i + 1 local b3 = string.byte(str, i) or 0 i = i + 1 return (b1 - 0xE0) * 4096 + (b2 - 0x80) * 64 + (b3 - 0x80) else return 32 -- 不支持的字符显示为空格 end end end -- 处理字符串中的每个字符 for code in utf8codes(str) do -- 处理换行符 if code == 10 then -- \n 的 ASCII cursorX = 1 cursorY = cursorY + fontHeight else local charMap = font[code] or font[32] local charWidth = #charMap[1] -- 检查是否需要换行 if cursorX + charWidth - 1 > width then cursorX = 1 cursorY = cursorY + fontHeight end -- 检查是否需要滚动屏幕 if cursorY + fontHeight - 1 > screenHeight then term.scroll(fontHeight) cursorY = cursorY - fontHeight end -- 显示字符 displayChar(charMap, cursorX, cursorY, textColor, backgroundColor) cursorX = cursorX + charWidth end end -- 自动换行(处理完字符串后) cursorX = 1 -- 光标应该位于下一行的顶部,而不是底部 cursorY = cursorY + fontHeight -- 检查滚动(换行后) if cursorY > screenHeight then term.scroll(fontHeight) cursorY = screenHeight - fontHeight + 1 end end return printUtf8