Ü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ğı
cevap
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
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!
Bu sınıfı bazı dizgilerle ve getterlerle göstermeye ne dersiniz? –
@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
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