You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stormworks嵌入式Lua屏幕绘图报错问题求助

问题修复方案

核心错误点

  1. Lua布尔值大小写错误:你用了Python的True,但Lua里布尔常量是小写的true,大写True会被识别为未定义的全局变量,直接触发报错。
  2. 重复定义onDraw函数:第一个空的onDraw会被第二个覆盖,完全多余,还可能导致逻辑混乱。
  3. 全局变量未初始化:tar1、az1等变量第一次执行时可能是nil,加上onTick里计算az1时用到的w/h,如果onTick先于onDraw执行,此时w/h还没赋值,会导致计算结果为nil,传给screen.drawLine就报错。
  4. 无效的绘制调用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:17:43