Stormworks嵌入式Lua屏幕绘图报错问题求助
问题修复方案
核心错误点
- Lua布尔值大小写错误:你用了Python的
True,但Lua里布尔常量是小写的true,大写True会被识别为未定义的全局变量,直接触发报错。 - 重复定义
onDraw函数:第一个空的onDraw会被第二个覆盖,完全多余,还可能导致逻辑混乱。 - 全局变量未初始化:
tar1、az1等变量第一次执行时可能是nil,加上onTick里计算az1时用到的w/h,如果onTick先于onDraw执行,此时w/h还没赋值,会导致计算结果为nil,传给screen.drawLine就报错。 - 无效的绘制调用:
screen.drawLine(az1,h1,az1,h1)画的是一个点,改成有长度的线条才有意义(可选优化)。
修复后的代码
-- 提前初始化全局变量,避免nil值问题 local tar1, tar2 = false, false local az1, h1, az2, h2 = 0, 0, 0, 0 local w, h = screen.getWidth(), screen.getHeight() function onTick() tar1 = input.getBool(1) tar2 = input.getBool(2) az1 = input.getNumber(2) h1 = input.getNumber(3) az2 = input.getNumber(6) h2 = input.getNumber(7) -- 每次tick都更新屏幕尺寸,避免屏幕变化导致计算错误 w = screen.getWidth() h = screen.getHeight() -- 调整坐标计算逻辑(这里的*10可以根据实际需求调整) az1 = az1 * 10 * w h1 = h1 * 10 * h az2 = az2 * 10 * w h2 = h2 * 10 * h end function onDraw() w = screen.getWidth() h = screen.getHeight() screen.setColor(0, 255, 0) -- 用小写true,同时确保变量不为nil if tar1 == true then -- 改成画可见的线条,你可以根据需求调整终点坐标 screen.drawLine(az1, h1, az1 + 10, h1) end end
额外说明
- Lua里全局变量不需要声明,但提前初始化能避免nil值引发的各种报错,尤其是Stormworks的脚本执行顺序不固定,
onTick和onDraw的执行时机不一定按预期来。 - 如果你想限制变量作用域,也可以用
local声明局部变量,但全局变量在Stormworks的脚本里更方便跨函数共享数据。 - 检查输入索引是否正确:比如
az1 = input.getNumber(2)和tar1 = input.getBool(1),确保对应到你在游戏里设置的输入端口。
内容的提问来源于stack exchange,提问作者Krygzh
相关产品推荐
相关产品推荐

