Podstawowe informacje
Głównym celem stosowania języków skryptowych jest możliwość ingerencji w istniejący system(np. silnik gry) bez konieczność znajomości i ingerencji w kod źródłowy. Przykładami języków skryptowych są np. Bash, Python, Perl, PHP, UnrealScript czy interesująca nas Lua.
Języki skryptowe znalazły swoje zastosowanie w procesie tworzenia gier komputerowych np. w agorytmach sztucznej inteligencji(sterowanie postaciami Non-Playable Characters), obsługi interfejsu gry czy sterowaniem przebiegiem fabuły(np. dialogi). Jednym z najczęściej wybieranym językiem okazał się język Lua. Zastosowany został w takich tytułach jak: Crysis, FarCry, Baldur's Gate, World of Warcraft czy nasz rodzimy Wiedźmin.
Dostępne frameworki umożliwiają na przykład wywoływanie funkcji silnika z poziomu skryptów, lub odwrotnie. Pozwalają rownież na wprowadzanie zmian w trakcie działania programu, bez potrzeby ponownego uruchamiania lub rekompilacji. Wystarczy tylko przeładować zmodyfikowany skrypt. Przyspiesza to znacznie prace nad aplikacją, gdzie w skomplikowanych projektach czasy kompilacji mogą być bardzo długie.
Instalacja sol3
Aby rozpocząć pracę z Lua wbudowanym w program w języku C++, należy pobrać skompilowaną dla naszego systemu operacyjnego implementacje języka. Można ją znaleźć na stronie: http://luabinaries.sourceforge.net/download.html. Zaawansowani użytkownicy mogą skompilować implementacje z plików źródłowych. Takie rozwiązanie zapewnia lepszą kompatybilność. Drugim krokiem jest pobranie aktulanej wersji biblioteki sol3 ze strony https://github.com/ThePhD/sol2/releases. Biblioteka ta rozbudowuje możliwości Lua C API. Charakteryzuje się intuicyjnym interfejsem programistycznym, zgodnym z najnowszym standardem języka C++, oraz wysoką efektywnością czasową. Po pobraniu obu bibliotek należy je dołączyć do projektu.
Przegląd najważnieszych funkcji
Ustawienie i pobranie zmiennych.
#include
int main(int, char*[]) {
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.set("number", 24); //int
lua["number2"] = 24.5; //float
lua["important_string"] = "woof woof"; //string
lua["a_function"] = []() { return 100; }; //func
lua["some_table"] = lua.create_table_with("value", 24); //table
return 0;
}
Użycie funkcji zarówno w Lua, jaki i C++.
#include <sol/sol.hpp>
int main(int, char*[]) {
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.script("function f (a, b, c, d) return 1 end");
lua.script("function g (a, b) return a + b end");
sol::function fx = lua["f"];
std::function stdfx = fx;
int is_one = stdfx(1, 34.5, 3, "bark");
int is_also_one = fx(1, "boop", 3, "bark");
int is_three = lua["g"](1, 2);
double is_4_8 = lua["g"](2.4, 2.4);
return 0;
}
Tablica z Lua
#include <sol/sol.hpp>
#include
int main(int, char*[]) {
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.script(R"(
abc = { [0] = 24 }
def = {
ghi = {
bark = 50,
woof = abc
}
}
)");
sol::table abc = lua["abc"];
sol::table def = lua["def"];
sol::table ghi = lua["def"]["ghi"];
int bark1 = def["ghi"]["bark"]; //50
int bark2 = lua["def"]["ghi"]["bark"]; //50
int abcval1 = abc[0]; //24
int abcval2 = ghi["woof"][0]; //24
return 0;
}