Wprowadzenie do biblioteki sol3

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;
}