添加 utf8print12px.lua
This commit is contained in:
209
utf8print12px.lua
Normal file
209
utf8print12px.lua
Normal file
@@ -0,0 +1,209 @@
|
||||
--这是一个简单的打印字符的程序,他使用下方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-12px-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
|
||||
|
||||
Reference in New Issue
Block a user