1
我正在編寫一個腳本來移動遊戲中的物品進出存儲。我曾計劃在運行腳本時沒有足夠的可用空間的情況下允許項目隊列。我還計劃允許同時存在多個隊列(例如:將項目移動到清單中的隊列,以及將項目移動到存儲中的第二個隊列)。這是不適合使用協程的嗎?
我原本以爲我應該使用協程來實現這一點。第一個隊列將一直運行,直到項目(存儲或庫存)的目標已滿,然後使用coroutine.yield暫停並允許下一個隊列運行。當可用空間打開時,隊列將被重新啓動。
threads = {}
local co = coroutine.create(function(list, target)
--list: a list of items to be moved
--target: inventory or storage (where the item is to be moved)
while list.n > 0 do
if target.count < target.max then
move(list:last(), target)
else
coroutine.yield()
end
end
end)
threads:append(co)
-- this code would run when free spaces were detected
for i = 1, #threads do
local status = coroutine.resume(threads[i])
if not status then
threads:remove[i]
end
end
但是,我意識到我不一定需要使用協程。
inventory_lists = {}
-- lists of items to be moved to the inventory
storage_lists = {}
-- lists of items to be moved to the storage
run_threads = function(list, target)
while list.n > 0 and target.count < target.max do
move(list:last(), target)
end
end
-- this code would run when free spaces were detected
for i = 1, #inventory_lists do
run_threads(inventory_lists[i], inventory)
end
for i = 1, #storage_lists do
run_threads(storage_lists[i], storage)
end
這些代碼片段完成相同的事情,我看不出有任何理由使用其中一個。在這種情況下,我應該避免使用協程,因爲似乎沒有優勢?
我在第二種情況下沒有看到刪除線程的部分。 –
你說得對,那需要加入。也可能有其他錯誤,因爲我爲了提供一個例子而快速寫下了它。 – ms4000kb
爲什麼不將它們存儲在主「隊列」表的子表中,並遍歷它們,循環每一個表。爲什麼這需要協程呢? – warspyking