gpt4 book ai didi

lua - 如何在 Lua 中结束循环协程?

转载 作者:行者123 更新时间:2023-12-04 18:08:05 27 4
gpt4 key购买 nike

我目前正在使用 Roblox(使用 Lua)开发游戏。它基本上由几个小游戏组成。在每一轮开始时,游戏中的所有玩家都被放在一张 table 上并传送到一个区域。这就是协程发挥作用的地方。随着回合的进行,我想要一个协程开始。该协程每秒检查玩家的健康状况是否低于零,如果是,则将其从 currentPlayer 表中删除。

对不起,如果我没有正确描述问题,但协程不会屈服。我以前没有使用过协程,所以我可能试图以错误的方式产生它。我知道你们大多数人不会熟悉 Roblox,但 Lua 语法是相同的。

有人可以举一个例子来说明我将如何结束循环协程吗?

currentPlayers = {}
roundTime = 60

local lookForWinners = coroutine.create(function()
while coroutine.running do
wait(1)
for i, v in pairs(currentPlayers) do
if v.Character.Humanoid.Health <= 0 then
table.remove(currentPlayers, v)
end
end
end
end)


while wait() do
repeat display("Two or more players need to be in the game.", 1) until #_G.plrs > 1 --Ignore, just checks if two+ players are in game.
display("Picking a map...", 3) pickMap()
teleport(0, 500, 0)
coroutine.resume(lookForWinners)
wait(roundTime)
print("Round over")
coroutine.yield(lookForWinners)
end

最佳答案

Lua 是一种单线程语言。协程不会导致函数并行执行。

协程实际上只是一种使函数可以暂停自己的执行(使用 coroutine.yield ),可以从外部恢复(使用 coroutine.resume )的方法。 There is no "coroutine.running" :在任何给定时间只有一行“正在运行”。

如果 Roblox 是供您使用 wait()要跳出 Lua 线程,您可以将其编写为一系列检查其条件的循环,然后调用 wait() :

local currentPlayers={}
local roundTime = 60

while #_G.plrs > 1 do
display("Two or more players need to be in the game.", 1)
wait()
end
display("Picking a map...", 3) pickMap()
teleport(0, 500, 0)

for i=0, roundTime do
for i, v in pairs(currentPlayers) do
if v.Character.Humanoid.Health <= 0 then
table.remove(currentPlayers, v)
end
end
wait(1)
end
print("Round over")

然而, 这是错误的代码 . (每当您编写代码时,让其中包含“等待”函数的循环用于指示某些操作不正确。)您应该使用 Roblox 的 Events处理你的游戏逻辑。
  • 检查游戏是否应该只在玩家数量发生变化时开始。
  • “寻找赢家”仅在类人生物的健康发生变化时(HealthChanged 事件)。
  • 以某种计时器或间隔运行计时器(不要忘记,一旦有人获胜,您可能希望提前结束游戏)。

  • 与繁忙的循环相比,事件有很多很多优点;最明显的是,当他们正在检查的事情发生时,您的检查就会发生,而不是稍后。

    关于lua - 如何在 Lua 中结束循环协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21863583/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com