To jest stara wersja strony!
Łączenie języka C++ i Lua
Wstęp
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.
Innym popularną aplikacją wykorzystującą język Lua jest Adobe Lightroom, którego ok. 40% kodu źródłowego napisanego jest w Lua. Pełna lista gier i programów wykorzystujących Lua dostępna jest na stronie http://www.lua.org/uses.html
Lua jest językiem skryptowym łączącym ze sobą elementy języka proceduralnego o składni zbliżonej do języka Pascal, rozszerzonego o bardziej złożone konstrukcje opisu danych opartych na tablicach asocjacyjnych. Język został zaprojektowany w celu rozszerzenia funkcjonalności aplikacji, często jednak jest wykorzystywany jako samodzielny język. Lua jest projektem open-source zaimplementowanym w języku C zgodnie ze standardem ANSI C,którego główną zaletą jest prostota, wydajność i przenośność kodu.
Wymagania
Podstawy języka Lua
Strona ma na celu ukazanie sposobów i możliwości integracji języków C++ oraz Lua, jednak przedstawię krótko podstawy języka Lua wraz z przykładami. W celu dogłębnego poznania składni i możliwość języka polecam dokumentacje umieszczoną na stronie internetowej.
Na początek standardowy Hello World( Listing 1)
Konwencje leksykalne
W języku Lua identyfikatory mogą się składać z dowolnego łańcucha znaków alfanumerycznych lub znaku _.
Ograniczeniami są: zakaz rozpoczynania identyfikatora od cyfry oraz słowa zastrzeżone jak and, or, break, else itp.
Lua rozróżnia wielkość liter, więc For będzie oznaczał identyfikator zaś for będzie dotyczył pętli.
Komentarze rozpoczyna się podwójnym myślnikiem – i działa analogicznie jak
w C++, ignorowane są wszystkie znaki, aż do końca linii.
* Istnieje również możliwość komentowania całego bloku kodu na kształt znanych z języka C /* .. */, które w Lua zastąpione jest ciągiem –[[„.
=== Typy danych i wyrażenia ===
W Lua podobnie jak w innych językach skryptowych nie deklarujemy typów zmiennych. Zamiast tego każda zmienna ma dynamiczny typ określany przez jej wartość.
Istnieje 8 podstawowych typów danych:
* nil - przyjmuje jedną wartość nil, która określa brak konkretnej wartości (często nil jest stosowany do określenia zmienną niezainicjalizowaną);
* boolean - standardowe wartości boolowskie true/false;
* number - liczba rzeczywista, zmiennoprzecinkowa;
* string - standardowy łańcuch znaków;
* userdata - typ danych pozwalajacy na przetrzymywanie dowolnych danych z języka C(np. wskaźników);
* function - ciąg wykonywalnych instrukcji, funkcje mogą być deklarowane wewnątrz innych funkcji lub być zwracane z innej funkcji
* thread - wątek w Lua;
* table - tablica asocjacyjna(więcej informacji w dalszej części strony);
Ciekawym mechanizmem języka jest poleceniem type
pozwalające na sprawdzenie typu zmiennej. Przykład pokazano na Listingu 2.
W Lua dostępne są następujące operatory:
* Operatory arytmetyczne: +, -, *, /;
* Operatory porównania: ==, ~=, <, >, ⇐, >=-
* Operatory logiczne: and
, or
, not
=== Instrukcje i funkcje ===
Instrukcje i funkcje
Lua obsługuje standardowy zestaw instrukcji
podobnych do tych stosowanych w języku
Pascal czy C. Istnieje możliwość definiowania
bloków instrukcji objętych słowami kluczowymi
do i end, które można kontrolować
poprzez break czy return. Na listę pojedynczych
instrukcji składają się:
• instrukcje przypisania =;
• instrukcje warunkowe, if/elseif/else/
end;
• pętle, for/do/end, while/do/end, repeat/
until/;
• wywołania funkcji;
• lokalne deklaracje zmiennych.
Instrukcja przypisania może dotyczyć kilku
zmiennych. Pojedyncze instrukcje mogą
opcjonalnie kończyć się średnikiem.
Listing 3 ilustruje wykorzystanie funkcji,
zastosowanie pętli oraz instrukcji warunkowych
na przykładzie funkcji wyznaczającej
wartość minimalną i maksymalną z trzech
liczb, oraz funkcji obliczającej pierwiastki
równania kwadratowego.
Jak widzimy w przykładzie, funkcje mogą
przyjmować i zwracać więcej niż jeden
parametr. Istnieje również możliwość deklarowania
funkcji rekurencyjnych (Listing
4).
=== Tablice ===
Najistotniejszymi strukturami danych w Lua są tablice asocjacyjne reprezentowane przez kolekcję par (klucz, wartość). Kluczem może być wszystko poza
wartością nil
. Elementami tablicy mogą być wszystkie wartości podstawowych typów Lua. Oznacza to, że również mogą to być omawiane w tym miejscu Tablice. Pozwala to na tworzenie takich struktur jak lista, wektor, kolejka czy stos.
Listing 5 pokazuje przykłady
wykorzystania tablic w Lua realizując
proste zbiory danych, listę jednokierunkową,
czy strukturę zawierającą zarówno atrybuty
jak i metody.
==== Integracja z C++ ====
=== Przygotowanie do pracy z Lua ===
=== Wywoływanie funkcji Lua w C++ ===
=== Wywoływanie funkcji C++ w Lua ===
BUUU
==== Więcej informacji ====
http://www.lua.org - strona domowa Lua.
http://www.lua.org/manual/5.1 - dokumentacja on-line Lua.
http://lua-users.org/wiki/ - zbiór artykułów, dodatków i przykładów Lua
http://www.inf.puc-rio.br/~roberto/pil2/ - programowanie w Lua
http://code.google.com/p/luaforwindows/ - biblioteki i narzędzi dla systemu Windows.
http://luaforge.net/projects/luaforunix/ - biblioteki i narzędzi dla systemu Unix.
http://www.luarocks.org/ - deployment and management system for Lua modules.