2016-02-12 50 views
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 

這些代碼片段完成相同的事情,我看不出有任何理由使用其中一個。在這種情況下,我應該避免使用協程,因爲似乎沒有優勢?

+0

我在第二種情況下沒有看到刪除線程的部分。 –

+0

你說得對,那需要加入。也可能有其他錯誤,因爲我爲了提供一個例子而快速寫下了它。 – ms4000kb

+0

爲什麼不將它們存儲在主「隊列」表的子表中,並遍歷它們,循環每一個表。爲什麼這需要協程呢? – warspyking

回答

2

看起來這是對協程的不恰當使用,因爲根本沒有必要使用它們:表全部都可用,不需要存儲任何變量的狀態,並且所有信息都是立即的可用(無需阻止)。 我想這是不是在這個意義上不正確,它仍然運行,但是當你可以簡單地打印「你好\ nWorld」它類似於做

co = coroutine.wrap(function() 
    print('Hello') coroutine.yield() print('World') 
end) 
co() co()