Trochę więcej o skryptach w C++

0

Hej, chciałbym dowiedzieć się trochę więcej na temat działania i tworzenia skryptów. Powiedzmy że mam program napisany w C++ z użyciem biblioteki SFML gdzie są rożne postacie. Jak wygląda implementacja systemu skryptów w takim programie? Mam na myśli oskryptowanie tych postaci. Dowiedziałem się że najczęściej używa się do tego języka programowania Lua, ale nie wiem jak to wygląda od strony technicznej. Jak przechowywane są potem te skrypty w programie? Jak kod w Lua który jest zapewne w innym pliku używa zmiennych z głównego programu? Jak wgl wygląda taki skrypt i czy są jakieś poradniki albo może gotowe już biblioteki które mogłyby mi pomóc się zagłębić w tym temacie?

1

Nie znam się na Lua, ale miałem do czynienia z osadzaniem Pythona oraz tzw usecode (kto grał w stare RPGi Origin Systems, wie o czym mówię).
Generalnie: zależnie co potrzebujesz zrobić, ale program "główny" musi wystawić jakieś api, tak, żeby skrypt był w stanie się do niego "dopiąć".
Co do przechowywania tych skryptów: różnie. Mogą być na dysku (jako zwykłe pliki bądź w formie jakoś popaczkowanych resource'ów), mogą być w formie surowej być wkompilowane w program...
Ogólnie to czego szukasz to imho tzw. binding geneator.
Nie pomogę z Lua i SFMLem ponad to co sam na szybko znalazłem:
http://lua-users.org/wiki/BindingCodeToLua
W temacie Pythona i QT (imho bardzo przyjemnie to działa):
https://doc.qt.io/archives/qq/qq23-pythonqt.html
...oraz polecam zobaczyć jak to robi GDB.
Możesz też spojrzeć na emulator rxvt-unicode w kontekście osadzania Perla.

1

Zacznij czytanie od tego:
http://www.lua.org/manual/5.3/manual.html#4

Nie mam za dużo czasu, aby teraz pisać więcej. Ale wbudowywałem Luę w aplikacje.
Mogę coś dłużej napisać, ale w innym czasie.

1

Polecam tego gościa. Ma kilka filmów na temat LUA

0

A jakie jest konkretnie zadanie skryptów? Z tego co wyczytałem to dodaje się tę funkcjonalność bo potem można skrypty łatwo edytować bez ingerencji w kod źródłowy,czyli mogę zlecić innej sobie pisanie skryptów a ona nie musi mieć dostępu do kodu źródłowego. I w jakich przypadkach na np. przykładzie platformówki się skrypty stosuje? Wydaje mi się że skryptuje się np. postać, jesli w kodzie źródłowym jakiś warunek bedzie spełniony to uruchamia się skrypt jakiejś postaci która będzie np. wykonywała jakieś akcje,typu podejdzie do nas, wywoła okno dialogu albo coś. Możecie mi to bardziej naświetlić?

2

Lua jest de facto standardem w przemyśle, ale osobiście nie ufam językom, które indeksują tablice od jedynki. Warto więc zwrócić uwagę na alternatywy, jak Angel Script, albo ChaiScript. Hello world z tego ostatniego, pokazuje jak to może wyglądać:

#include <chaiscript/chaiscript.hpp>

std::string helloWorld(const std::string &t_name) {
  return "Hello " + t_name + "!";
}

int main() {
  chaiscript::ChaiScript chai;
  chai.add(chaiscript::fun(&helloWorld), "helloWorld");

  chai.eval(R"(
    puts(helloWorld("Bob"));
  )");
}

Bindujesz sobie funkcje z C++ do odpowiednich funkcji języka skryptowego, a potem go wywołujesz, odczytując z jakiegoś pliku, na przykład jako reakcję na kliknięcie na jakiś przycisk czy postać w grze. Idea jest taka, żeby nie kompilować całego kodu od zera za każdym razem, gdy zmodyfikujesz jakieś zachowanie. Przykładowo, możesz sobie zaimplementować jakieś AI dla NPC-ów - tworzysz funkcje typu idź, atakuj, wykonaj animację itd. a potem osobno w pliku ze skryptem tego używasz by implementować jakieś zachowanie. Poprawki możesz wówczas testować natychmiast, zamiast czekać aż kompilator ci wszystko zmieli. Przy releasach natomiast można wszystkie te skrypty spakować jakoś do stringa w pamięci, żeby oszczędzić czas na ich ładowanie z dysku.

1

... więc o skryptach. Motywacje

Sensu skryptowania zbyt wyraźnie nie widać, jak jesteś programistą np C++ i piszesz jakieś utility dla siebie. Masz nowy pomysł, potrzebę, to go kodujesz.
Nie widać, jak profesjonalnie powstaje software dla jednego użytkownika, np softwarowa korpo X dla banku Y, albo dział softwarowy ubezpieczyciela dla macierzystej firmy. 1)

Sens skryptowania się ujawnia w całej barwie, jak powstaje software do wielokrotnego użycia, u różnych użytkowników.
Wyobraźmy sobie startującą firmę softwarową, zyskuje drugiego, trzeciego klienta. Drugi klient życzy sobie zmiany w funkcjonalności A, trzeci w funkcjonalności B. Taka firma (załóżmy) zrobi w kodzie

if(numerKlienta==2){
}

if (numerKlienta==3){
}
//albo
#if defined( Klient_1)
   ...
#elif defined(KLient_2)
   ... 
#endif

To taki przykład na niby, jak są bardziej porządni, robią to wzorcami Strategii czy innymi.
Z kolei jak mają szczęście, pomysł klienta jest ogólnie przydatny, może wejść w linię główną, ale to rzadkość.
Tym niemniej przy piątym, piętnastym kliencie ujawnia się cała choroba takiego sposobu - a czasem wymagania sa sprzeczne, jeden klient potrzebuje okrągłych kwadratów, drugi 2+2=3.99 (autentyczne) - wprowadzanie takich rzeczy do linii głownej by było samobójstwem.

I tu się pojawia skryptowanie. Pakiet oprogramowania wychodzący z firmy softwarowej nie zawiera kodu specyficznego.
Specyficzny kod powstaje nie w firmie softwarowej, ale u "informatyków" klienta, pod wskazaniami i w/g API dostarczonego przez programistów, ale nie na ich projekcie i odpowiedzialność.

Zmienia to również dynamikę czasową. Wyobraźmy sobie, firma softwarowa jest porządna, niczego nie wytworzy bez zaprojektowania, zatwierdzenia i testów. 2)
Dla najlepszych i dużo płacących klientów 1.5 miesiąca. W normalnej sytuacji od idei do przekazania upływa 4mc.
Ale mamy we wtorek telefon "w następny poniedziałek przyjeżdża TiR z dostawą Fizdrygałek, i jak będziemy to sprzedawać, każda paczka ma być sprawdzona, czy ..."
Czujesz?

  1. da się podac przykłady, ale to zostawmy.

  2. zwłaszcza, że wypuszczanie dużego softwaru w C++, Javie, C# tego wymaga.
    Konkretny skrypt jest mały (np. dla tej paczki OnDeliveryStarted) , uruchamiany w pewnym "więzieniu" czy "piaskownicy" (jail / sandbox), działa w wiele, wiele prostszym kontekście (nie tzreba najlepszych specjalistów), nie narozrabia zbytnio, nie przejedzie pamięci przez źle użyty pointer, nie zmieni plików, bo w ogóle nie ma koncepcji pliku - ma tylko swoje środowisko.
    (Oczywiście firma softwarowa musi mieć ideę, przewidzieć, ze może być potrzeba OnDeliveryStarted, ale siłą rzeczy nie mają pojęcia co życie przyniesie. W idealnie zaprojektowanym kontekście np jest do odczytu obiekt Klient, Faktura, MiejsceWysyłki, do zapisu i odczytu dane logistyczne)

Rygoryści testowania będą krzyczeć, ale ja bym akceptował, że wystarczy "przeklikanie" na kopii bazy, albo na oryginale, i uznajemy że jest sprawdzone. Pięc dni nie jest problemem.

PS. pewnie byś wolał przykład na grach. Nie znam ich niemal wcale, tylko co widziałem przez ramię. Wyobraź sobie zdarzenie "NewPersonOnScene" i skryptujesz to rzuceniem granatu

0

To wszystko wyjaśnia, więc wiem już co i jak. Mam jeszcze takie pytanie, ja używam fornatu JSON do wczytywania mapy z pliku do programu, jak dla mnie bardzo dobre rozwiązanie, ale widze że niektórzy używają lua do przechowywania danych mapy w pliku. Jest to dobrym rozwiązaniem mape/obiekty przechowywać w formacie JSON a same zachowania obiektów w LUA czy to wszystko powinno być w jednym formacie?

0

Tzn tak ....

Do pewnego stopnia wystarcza konfiguracja z danych. Wracając do tej mojej paczki, zestaw parametrów programu magazynowego:

  • minimalna waga
  • maksymalna waga
  • maksymalna długość
  • maksymalna waga dla PP
  • maksymalna waga dla kuriera
  • pierwsze widełki wagi
  • drugie widełki wagi
  • pierwsze widełki ceny
  • drugie widełki ceny
  • itd ...
    pozwala już w jakimś zakresie zarządzać procesem przygotowania wysyłek (to jakby te JSON). I może być wystarczające, ta nawet całkiem niezłe. Małe - średnie niższe programy "dla firmy" tak działają.

Ale w pewnym momencie życie przynoś zmianę jakościową, albo w czynnościach - wtedy (nawet bogaty) zestaw danych nie wystarcza.
Wtedy trzeba napisać choćby mini kod (jakby ta Lua)
Dane nie są złe, nawet w systemie ze skryptowaniem należy używać danych - źle by było TYLKO skryptowac dla każdej pierdoły (maksymalna długość) - ale są sytuacje, ze taka polityka (tylko na danych) się kończy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1