如何结束Lua中的循环协程?

如何结束Lua中的循环协程?,lua,roblox,Lua,Roblox,我目前正在使用Roblox(使用Lua)开发一款游戏。它基本上是由几个小游戏组成的。在每一轮开始时,游戏中的所有玩家都被放在一张桌子上,并被传送到一个区域。这就是协同程序发挥作用的地方。由于回合正在进行中,我想开始一次合作。协同程序每秒检查玩家的健康状况是否低于零,如果低于零,则将其从currentPlayer表中删除 很抱歉,如果我没有正确描述问题,但是协同程序将不会让步。我以前没有使用过协同程序,所以我可能试图以错误的方式实现它。我知道你们大多数人都不熟悉Roblox,但Lua语法是一样的

我目前正在使用Roblox(使用Lua)开发一款游戏。它基本上是由几个小游戏组成的。在每一轮开始时,游戏中的所有玩家都被放在一张桌子上,并被传送到一个区域。这就是协同程序发挥作用的地方。由于回合正在进行中,我想开始一次合作。协同程序每秒检查玩家的健康状况是否低于零,如果低于零,则将其从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
currentPlayers={}
往返时间=60
locallookforwinners=coroutine.create(函数()
当协同程序运行时
等待(1)
对于i,v成对(当前玩家)做
如果v.Character.Humanoid.Health 1——忽略,只需检查游戏中是否有两名以上的玩家。
显示(“拾取地图…”,3)拾取地图()
传送(0,500,0)
合作计划。简历(寻找赢家)
等待(往返时间)
打印(“四舍五入”)
合作计划收益率(寻找赢家)
结束

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

协同路由实际上只是一种使函数暂停其自身执行的方法(使用
coroutine.yield
),可以从外部恢复(使用
coroutine.resume
):在任何给定时间只有一行“正在运行”

如果Roblox是让您使用
wait()
跳出Lua线程的,那么您可以将其编写为一系列循环,检查它们的状态,然后调用
wait()

localcurrentplayers={}
本地往返时间=60
而#G.plrs>1
显示(“游戏中需要两个或更多玩家。”,1)
等等
结束
显示(“拾取地图…”,3)拾取地图()
传送(0,500,0)
对于i=0,取整时间do
对于i,v成对(当前玩家)做

如果v.Character.Humanoid.Health我建议您按照Stuart的建议使用事件;这主要是为了提供关于什么是协同程序以帮助您正确使用它们的附加信息

将协程视为可能返回值的函数,但有一个扭曲:虽然是“正常的”函数在执行
return
时完成,当您从协同程序中
yield
时,它保存其状态,以便
resume
可以从您放弃的点继续,就像什么都没有发生一样。请注意,您只从协同程序中
yield
,并且只到该协同程序的
resume
的点ne已完成(这与调用函数并从中返回没有区别;控件返回到调用函数的位置)

除此之外,
resume
yield
调用允许您将值传递给协程并从协程返回(中间)值。有关如何使用的示例,请参见此

您仍然可以从协同程序
返回
,这与从完成执行的函数返回没有什么不同。如果您当时检查协同程序的状态(
coroutine.status
),它应该是“死的”


因此,要回答您的问题,如何结束循环协同程序:您可以从中
返回
,您可以从中
产生()
,然后您可以捕获并检查
简历电话的结果。话虽如此,我同意斯图尔特的观点,这可能是解决您问题的错误方法。

谢谢您修复了代码,我的遗憾是没有正确发布代码。
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")