【问题标题】:Is there a reason why this code is not outputting a worth这段代码没有输出价值是否有原因
【发布时间】:2019-10-23 07:04:10
【问题描述】:

问题

您好,StackOverflow 社区!我正在开发这个 Lua 游戏,我正在测试它是否会将我的 TextLabel 上的文本更改为比特币当前的价值,当什么都没出现时,我感到非常失望。

我曾尝试在谷歌上做研究,我的代码似乎刚刚好。

代码

Change = false
updated = false 
while Change[true] do   --While change = true do
    worth = math.random(1,4500) --Pick random number
    print('Working!') --Say its working
    Updated = true --Change the updated local var.
end --Ending while loop

script.Parent.TextLabel.Text.Text = 'Bitcoin is currently worth: '  .. worth 
--Going to the Text, and changing in to a New worth.
while Updated[false] do --While updated = false do
    wait(180) --Wait
Change = true --After waits 3 minutes it makes an event trigger
end -- Ending while loop
wait(180) --Wait
Updated = false --Reseting Script.

我希望标签上的输出是一个随机数。

【问题讨论】:

  • 您有很多没有提供任何价值的 cmets。像While updated = false do 这样的东西几乎写了两次完全相同的东西,一次在代码中,第二次在评论中。不是每一行代码都需要注释,有些代码是自我记录的,虽然很多老师会告诉你不同的......

标签: lua roblox


【解决方案1】:

我无法真正与 roblox 交谈,但您的代码存在一些明显的问题:

  1. 案例

您在大写字母(“Updated”、“Change”)和小写字母(“updated”、“change” [in commented while statement])之间存在混淆,这将失败。参见,例如:

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

因此,要特别注意大写的标识符。一般来说,大多数程序员都会将这样的变量保留为全小写(或者有时像camelCase)。我想可能有一些不区分大小写的古怪 lua 运行时,但我不知道有一个。

  1. 类型误用。

Updated 是一个布尔值(一个真/假值),所以语法:

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. 缺少线程。

您基本上有两件不同的事情要尝试一次做,即尽可能快地随机更改“价值”变量(它处于循环中)并查看一组标签以匹配它(看起来像您可能希望它不断变化)。这需要两个操作线程(一个用于更改价值,另一个用于读取并粘贴在标签上)。你写这个就像你假设你有一个电子表格或其他东西一样。你的代码实际上在做什么:

  • 设置一些变量
  • 无限期更新,打印“工作中!”一堆,还有……
  • 永不停止

其余代码永远不会运行,因为其余代码不在后台线程中(基本上第一位独占运行时,从不屈服于其他所有代码)。

最后,即使顶部代码在后台运行,您也只需将文本标签一次设置为“比特币当前价值:3456”(或某个类似数字)一次。这种编写方式之后不会有任何更新(而且,如果它在另一个线程预热之前运行一次,它可能根本没有设置为任何有用的东西)。

我的猜测是,由于标识符问题,您的运行时会左右吐出错误和/或在紧密的无限循环中运行并且从未真正进入标签刷新逻辑。

【讨论】:

  • 你这里有一个错字> "While change = true do"应该有第二个=
  • 没错。已更新。
【解决方案2】:

BJ Black 对语法问题给出了很好的描述,因此我将尝试介绍 Roblox 的部分内容。为了让这种事情在 Roblox 游戏中正常工作,这里有一些假设需要仔细检查:

  • 既然我们使用的是 TextLabel,它是否在 ScreenGui 中?还是 SurfaceGui?
    • 如果在 ScreenGui 中,请确保 ScreenGui 在 StarterGui 中,并且此代码是否在 LocalScript 中
    • 如果它在 SurfaceGui 中,请确保 SurfaceGui 正在装饰部件和此代码 在脚本中

在你检查了所有这些部分之后,也许这更接近你的想法:

-- define the variables we're working with
local textLabel = script.Parent.TextLabel 
local worth = 0

-- create an infinite loop
spawn(function()
    while true do

        --Pick random number
        worth = math.random(1,4500) 

        -- update the text of the label with the new worth
        textLabel.Text = string.format("Bitcoin is currently worth: %d", worth)

        -- wait for 3 minutes, then loop
        wait(180)
    end
end)

我删除了UpdatedChanged,因为他们所做的只是决定是否更改值。你的循环流程是:

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

所以希望这更清晰,更接近你的想法。

【讨论】:

  • 是画面GUI,谢谢!你帮了我很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2019-12-23
  • 2011-01-23
  • 2021-02-23
  • 2021-04-09
  • 1970-01-01
相关资源
最近更新 更多