为什么这段代码没有输出值?

问题

大家好,我正在编写一个基于 Lua 的游戏,我希望能够将 TextLabel 上的文本更改为当前比特币价格,并测试了一下,但是什么也没有显示。

我已经在 Google 上搜索了,发现我的代码似乎没有问题。

代码

Change = false
updated = false
while Change[true] do   --当 Change 为 true 时执行
    worth = math.random(1,4500) --生成一个随机数
    print('Working!') --显示正在工作
    Updated = true --更新 Updated 变量
end --结束循环

script.Parent.TextLabel.Text.Text = '比特币目前价格为:'  .. worth
--让文本框显示新的价格
while Updated[false] do --当 Updated 为 false 时执行
    wait(180) --等待
Change = true --等待三分钟后触发事件
end --结束循环
wait(180) --等待
Updated = false --重置脚本

我希望 Label 上显示一个随机数。

点赞
用户6020403
用户6020403

我不太了解 roblox,但是你的代码中存在几个明显的问题:

  1. 大小写

你的代码中大小写混淆("Updated","Change" 大写,"updated","change" 在注释的 while 语句中小写)会导致错误。例如:

bj@bj-lt:~$ lua
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> Updated = true
> print(Updated)
true
> print(updated)
nil

因此,请非常小心标识符的大小写。一般来说,大多数程序员将变量保持全小写(或者有时是驼峰大小写)的格式。我想可能会有一些特殊的 lua 运行环境是不区分大小写的,但我不知道有哪些。

  1. 类型错误

"Updated" 是一个布尔值(一个 true/false 值),因此 "while Change[true] do" 的语法是无效的。例如:

> if Updated[true] then
>> print("foo")
>> end
stdin:1: attempt to index global 'Updated' (a boolean value)
stack traceback:
    stdin:1: in main chunk
    [C]: in ?

还要注意,"While change == true do" 也是错误的,因为大小写不正确("While" 不是有效的 lua,但 "while" 是有效的)。

  1. 缺少线程

你基本上要尽快随机更改 "worth" 变量的值(它在一个循环中),并将一个标签的值设置为相应的值(它看起来可能需要不断更改)。这需要两个线程的操作(一个用于更改价值,另一个用于读取并将其放在标签上)。你的代码就好像你假设你有一个电子表格或类似的东西。实际上,你的代码正在做以下事情:

  • 设置一些变量
  • 无限期地更新 "worth" 变量,打印 "Working!",并且...
  • 从不停止

代码的剩余部分永远不会运行,因为代码的其余部分不在后台线程中(基本上第一部分掌握了运行时间并且从不让出,以至于其他代码永远无法执行)。

最后,即使顶部的代码在后台运行,你仅仅将 Text 标签设置为一次,恰好为 "Bitcoin is currently worth: 3456"(或类似的数字)。从代码的编写方式来看,不会有任何之后的更新(如果它在另一线程运行之前运行一次,则可能根本不会设置为任何有用的东西)。

我猜测你的运行时可能由于标识符问题和/或运行时非常紧凑而导致错误,并且实际上没有到达标签刷新逻辑。

2019-06-07 20:44:55
用户2860267
用户2860267

BJ Black 已经详细说明了语法问题,所以我将尝试解释一下 Roblox 部分。为了让这种方式在 Roblox 游戏中正常工作,请确认以下几点:

  • 由于我们正在使用 TextLabel,请确认它是在 ScreenGui 还是 SurfaceGui 中。

    • 如果它在 ScreenGui 中,请确保 ScreenGui 在 StarterGui 中,并且这段代码是在 LocalScript 中。
    • 如果它在 SurfaceGui 中,请确保 SurfaceGui 装饰着一个 Part,并且这段代码是在 Script 中。

经确认所有的部分之后,可能更接近您想要的结果是:

-- 定义我们正在使用的变量
local textLabel = script.Parent.TextLabel
local worth = 0

-- 创建一个无限循环
spawn(function()
    while true do

        -- 选择随机数
        worth = math.random(1,4500)

        -- 使用新值更新标签的文本
        textLabel.Text = string.format("Bitcoin is currently worth: %d", worth)

        -- 等待 3 分钟,然后重复
        wait(180)
    end
end)

我移除了 UpdatedChanged,因为它们只是决定是否更改数值。您的循环流程如下:

  1. 什么也不做,显示未定义的数字。等待 3 分钟。
  2. 更新数字。显示它,等待 6 分钟。
  3. 重复 1 和 2。

所以希望这样更清晰,更接近您想要的结果。

2019-06-07 21:17:37