2015-08-03 27 views
7

Üzerinde çalıştığım bir proje için, başka bir kitaplıktaki bazı C++ sınıflarını Lua'ya göstermem gerekiyor. Ne yazık ki, bu kütüphanedeki en önemli sınıflardan biri çok sayıda Sendika ve Enum'a (the sf::Event class from SFML) sahiptir ve bir quick Google search'dan C++ Birlikleri'nin Lua'ya maruz kalması hakkında hiçbir şey olmadığını keşfettim. Lua/C API'sine, çalıştığı sürece bir kütüphaneye veya ciltleme oluşturucuya maruz kalması sorun değil. Ben (yani bağlayıcı bir jeneratör ile mümkün değilse)C++ sendikalarının Lua'ya nasıl yansıtılacağı

+0

Bu sınıfı bazı dizgilerle ve getterlerle göstermeye ne dersiniz? –

+0

@Calvin Benim durumumda (sf :: Event'i göstererek), bu çok karışık bir çözümdür, çünkü çok sayıda ifade içeren bir sürü getiri içerir. Ayrıca sf :: Event ve kullanıyorum kütüphane için alıcılar ile sorunları yaşadım. Ama başka bir kütüphaneyle/Lua/C API'siyle denemeye bakacağım. – Orfby

+0

Bir süredir bunun üzerinde sıkışmışsınız. C API'sini henüz öğrendiniz mi? Lua metabilerini iyi tanıyor musun? Eğer userdata ve metatables'in nasıl çalıştığını anlarsanız nispeten basittir. İşte [ilgili bir yazı] (http://stackoverflow.com/questions/31484773/call-c-functions-in-an-active-program-from-lua/31486050#31486050). – Mud

cevap

0

Eğer Lua nesnenin bu örneği daha sonra, C++ 'da bir nesne oluşturmak açığa isterler çünkü Ama, bağlayıcı bir jeneratör kullanmamayı tercih ediyorum Bir sendikadan ziyade destek :: varyantını kullanmaya istekliydiniz, benim LuaCast kitaplığımı kullanmayı deneyebilirsiniz.

Sendikaları temel tür olarak eklemeyi deneyeceğim. öncelikle yapmanız gerekir C/C++ işlevleri kaydetmek için

+0

OP, farklı bir kitaplıktan Lua'ya kod görüntülüyor: 3. taraf kitaplığını değiştirme olasılığı bulunmuyor. – Yakk

+0

@Yakk Bu yüzden bir sarıcı oluşturmaları gerekiyor – Alice

1

Lua sağlayan standart bir C fonksiyonu deseni gibi işlev görünüm:

extern "C" int MyFunc(lua_State* L) 
{ 
    int a = lua_tointeger(L, 1); // First argument 
    int b = lua_tointeger(L, 2); // Second argument 
    int result = a + b; 

    lua_pushinteger(L, result); 

    return 1; // Count of returned values 
} 

şu kalıbı izlemelidir Lua kayıtlı olması gerekiyor Her fonksiyonu. int dönüş tipi, lua_State* L tek parametre. Ve iade edilen değerlerin sayısı. Basit değişkenleri kayıt için

lua_register(L, "MyFunc", MyFunc); 

bu yazabilirsiniz: Eğer komut dosyasının içeriğine maruz böylece Ardından, Lua en sicil tablosundaki kayıt olmak gerekiyor Bundan sonra

lua_pushinteger(L, 10); 
lua_setglobal(L, "MyVar"); 

, sen' Bir Lua komut dosyasından işlevinizi arayabilir. Tüm nesnelerinizi, bunları kaydetmek için kullandığınız o belirli Lua durumuna sahip bir senaryo çalıştırmadan önce kaydetmeniz gerektiğini unutmayın. Lua yılında

:

print(MyFunc(10, MyVar)) 

Sonuç:

Bunu size yardımcı olabilecek tahmin!