2013-06-17 18 views
6

Fonksiyonları bir tabloya kaydedebildim. Ama şimdi onları nasıl çağırdığımı bilmiyorum. Final masasında yaklaşık 100 çağrı olacak, eğer mümkünse, bir foreach döngüsünde sanki onları çağırmak istiyorum. Teşekkürler! Fonksiyon tanımları VeeeLua - Tabloda Depolanmış Bir Fonksiyon Yürütme

game_level_hints = game_level_hints or {} 
game_level_hints.levels = {} 
game_level_hints.levels["level0"] = function() 
    return 
    { 
     [on_scene("scene0")] = 
     { 
      talk("hint0"), 
      talk("hint1"), 
      talk("hint2") 
     }, 
     [on_scene("scene1")] = 
     { 
      talk("hint0"), 
      talk("hint1"), 
      talk("hint2") 
     } 
    } 
end 

: Burada

tablo tanımlandı nasıl

function on_scene(sceneId) 
    -- some code 
    return sceneId 
end 

function talk(areaId) 
    -- some code 
    return areaId 
end 

DÜZENLEME: onlar biraz gerekecek yüzden fonksiyonlarını modifiye

daha fazla bağlam. Temel olarak dizeleri şimdi döndürüyorlar. Ve gerçekleştirmeyi umduğum şey, o zaman fonksiyonlarını çağırmanın sonunda, tüm bu dizeleri içeren bir tabloya (ideal olarak seviye tablosu) sahip olacağım.

+1

Döngüde nasıl veya neyi istendiğini açık değil. Belki de sahte kodları açıklayabilir ve verebilirsin. BTW — Lua'nın işaretçisi yok. İşlevler, 'function' türünde değerlerdir ve ifadelerde herhangi bir yerde kullanılabilir. –

+0

@TomBlodget, bunu işaretlediğiniz için teşekkürler. Onu düzelttim. – brain56

cevap

4

yapın:

asd = game_level_hints.levels["level0"]() 

Şimdi, asd, ihtiyacım olan alan dizelerini içerir. hoşuna erişen

asd[1][1] 

: ideal olsa da, ben gibi verilere erişmek mümkün olması amaçlanmıştır

asd["scene0"][1] 

alan veriler yeterli olacaktır almak için. Sadece anahtarların etrafında çalışmalıyım.

Teşekkürler beyler.

+0

Muhtemelen bunu metatables ile yapabilirsiniz, ama muhtemelen çabaya değmez;) – dualed

1

Yapmaya çalıştığınız şey tam olarak belli değil. Anonim işlevinizin içinde, on_scene'un dönüş değerini anahtar olarak kullanan bir tablo döndürüyorsunuz. Ama on_scene'unuz hiçbir şey döndürmez. talk için aynı şey.

game_level_hints tablonuzdaki her bir seviyeyi çağırırken çağrılmak üzere on_scene ve talk numaralarını istediğinizi kabul edeceğim.

local maxlevel = 99 
for i = 0, maxlevel do 
    game_level_hints.levels["level" .. i] = function() 
    on_scene("scene" .. i) 
    talk("hint" .. i) 
    end 
end 
-- ... 
for levelname, levelfunc in pairs(game_level_hints.levels) do 
    levelfunc() 
end 
6

Kısa cevap: Bir dizide saklanan bir işlev (referans) aramak normalde yapacağını olarak, sadece, (parameters) ekleyin:

Eğer öyleyse, bu bunu nasıl olduğunu

local function func(a,b,c) return a,b,c end 
local a = {myfunc = func} 
print(a.myfunc(3,4,5)) -- prints 3,4,5 

Aslında,

local a = {myfunc = function(a,b,c) return a,b,c end} 
print(a.myfunc(3,4,5)) -- prints 3,4,5 

Uzun cevap bu kolaylaştırabilirsiniz: sen des do Beklediğiniz sonuçların ne olduğunu belirtin, ancak yazdıklarınız, beklediğiniz şeyi yapmak için olacaktır. Bu fragman atın:

game_level_hints.levels["level0"] = function() 
    return 
    { 
     [on_scene("scene0")] = 
     { 
      talk("hint0"), 
     } 
    } 
end 

[Bu paragraf artık soru güncellendikten sonra geçerlidir] Sen yapamaz "mağaza" tablosunda bu işlevler (Senden sonra on_scene ve talk işlevleri başvuru, ancak Bunları sorgunuzda açıkça referans olarak kullandım, bu sorunun hakkında olduğunu varsayalım. işlevleri). Aslında bu işlevleri çağırır ve döndürdükleri değerleri (her ikisi de nil döndürür) saklar, bu nedenle bu parça çalıştırıldığında, nil dizini nil dizinini kullanarak depolamaya çalışırken "tablo dizini sıfır" hatası alırsınız.

Eğer game_level_hints.levels["level0"] saklanan işlevi çağırmak istiyorsanız, sadece siz yanıtladı ve yorumladı şeye ben bir çözüm olarak aşağıdaki kodla gelmek mümkün oldu kullanma game_level_hints.levels["level0"]()