dragon age początek przebudzenie origins toolset tool set szara straż tutorial tutoriale szarzy strażnicy grey wardens

11. O skryptach bardziej technicznie
ToolSet - Tutoriale
wtorek, 20 kwietnia 2010 21:55
1. Skryptowanie ogólnie

Skrypty używane są prawie zawsze wtedy, gdy autor chce wpłynąć na zachowanie się gry. Składnia skryptów Dragon Age przypomina do złudzenia język C, jednak występują tu pewne różnice.
Dokładną dokumentację znajdziecie w pliku "descript.chm" w folderze Dragon Age\packages\core. Tutaj przedstawione zostaną tylko podstawowe zagadnienia.

Skrypty głównie stosowane są w celu:
- prowadzenia fabuły
- skryptowania konwersacji
- obsługiwania sztucznej inteligencji
- obsługiwania umiejętności, talentów i zaklęć


2. Operatory

Język skryptowy Dragon Age posiada następujące operatory:

2.1 Operatory Arytmetyczne:
Nazwa Przykład Opis
Inkrementacja prefiksowa while(++a < 10)
{
     // kod
}
Zwiększa o 1 wartość zmiennej, przed wywołaniem kodu w pętli. Innymi słowy - najpierw zwiększa wartość zmiennej, następnie sprawdza prawdziwość warunku i dopiero kiedy warunek okaże się prawdziwy, wywołuje kod.
Inkrementacja postfiksowa for(int i = 0; i < 10; i++)
{
     // kod
}
Zwiększa wartość zmiennej o 1, po wywołaniu funkcji. Innymi słowy - sprawdza poprawność warunku, wywołuje kod (jeśli warunek okaże się prawdziwy) i dopiero na końcu zwiększa wartość zmiennej i o 1.
Przypisanie przez dodawanie a += b; Przypisuje zmiennej a wynik dodawania a + b. Jest to skrócony zapis, pozwalający przyspieszyć pisanie kodu. Alternatywa dla a = a + b
Odejmowanie x = a - b; Przypisuje zmiennej x wynik odejmowania a - b
Dodawanie x = a + b; Przypisuje zmiennej x wynik dodawania a + b
Dekrementacja prefiksowa while(--a > 10)
{
     // kod
}
Zmniejsza o 1 wartość zmiennej, przed wywołaniem kodu w pętli. Innymi słowy - najpierw zmniejsza wartość zmiennej, następnie sprawdza prawdziwość warunku i dopiero kiedy warunek okaże się prawdziwy, wywołuje kod.
Dekrementacja postfiksowa while(a-- > 10)
{
     // kod
}
Zmniejsza wartość zmiennej o 1, po wywołaniu funkcji. Innymi słowy - sprawdza poprawność warunku, wywołuje kod (jeśli warunek okaże się prawdziwy) i dopiero na końcu zmniejsza wartość zmiennej i o 1.
Przypisanie przez odejmowanie a -= b; Przypisuje zmiennej a wynik odejmowania a - b. Jest to skrócony zapis, pozwalający przyspieszyć pisanie kodu. Alternatywa dla a = a - b
Mnożenie x = a * b; Przypisuje zmiennej x wynik mnożenia a * b
Dzielenie x = a / b; Przypisuje zmiennej x wynik dzielenia a / b
Modulo (reszta z dzielenia) if (a % b == 1)
{
     //kod
}
Zwraca resztę z dzielenia zmiennej a przez zmienną b. Np.: zapis 14 % 4 da nam wynik 2.


2.2 Operatory porównania
Nazwa Przykład Opis
Mniejsze niż
if(a < b)
{
     // kod
}
Operator porównuje dwie zmienne. Jeśli a jest mniejsze od b zwraca wartość true.
Mniejsze lub równe
if(a <= b)
{
     // kod
}
Operator porównuje dwie zmienne. Jeśli a jest mniejsze lub równe b, zwraca wartość true.
Większe niż
if(a > b)
{
     // kod
}
Operator porównuje dwie zmienne. Jeśli a jest większe od b zwraca wartość true.
Większe lub równe
if(a >= b)
{
     // kod
}
Operator porównuje dwie zmienne. Jeśli a jest większe lub równe b, zwraca wartość true.
Różne od
if(a != b)
{
     // kod
}
Operator porównuje dwie zmienne. Jeśli a jest różne od b, zwraca wartość true.
Równe if(a == b)
{
     // kod
}
Operator porównuje dwie zmienne. Jeśli a jest równe b, zwraca wartość true.


2.3 Operatory logiczne
Nazwa Przykład Opis
Negacja logiczna (NOT)
if(!a)
{
     // kod
}
Neguje wartość zmiennej a. Np.: zmienia ją z true na false.
I logiczne (AND)
if(a && b)
{
     // kod
}
Sprawdza, czy obie zmienne są prawdziwe. Jeśli tak, zwraca true.
Lub logiczne (OR)
if(a || b)
{
     // kod
}
Sprawdza, czy którakolwiek ze zmiennych jest prawdziwa. Jeśli tak, zwraca true.


2.4 Inne operatory
Nazwa Przykład Opis
Proste przypisanie
a = b; Przypisuje zmiennej a wartość zmiennej b
Wywołanie funkcji
a(); Wywołuje funkcję a();
Indeks tablicy
tablica[0] = 1; Przypisuje indeksowi [0] tablicy wartość 1
Element (struktury)
struktura.element = 0; Przypisuje elementowi "element" struktury "struktura" wartość 0
Wyrażenie warunkowe
return a < b ? c : d; Porównuje dwie zmienne. Jeśli (a < b) jest prawdziwe, zwraca wartość c, jeśli warunek jest fałszywy, zwraca wartość d



3. Typy i zmienne

Jak w każdym języku skryptowym, tak i w tym z Dragon Age występują bardziej i mniej standardowe zmienne, struktury i typy danych. Ich opisy wraz z przykładami znajdziecie poniżej.

3.1 Zmienne
Język skryptowy Dragon Age wspiera następujące typy zmiennych:
Nazwa Przykład Opis
float
float fFloat = 0.1234f;
Zmienne typu float służą do przechowywania wartości zmiennoprzecinkowych
int
int nInteger = 1234;
Zmienne typu int służą do przechowywania liczb całkowitych
object
object oObject = getObjectByTag("monster_001");
Zmienne typu object przechowują obiekty występujące w grze (przeciwników, przedmioty, itp.)
resource
resource rGameIntroCutScene = R"game_intro_.cut";
Zmienne typu resource przechowują odniesienia do zasobów gry
string
string sString = "Hello World";
Zmienne typu string przechowują łańcuchy znaków (innymi słowy - zdania, wyrazy itp.)
vector vector vVector = Vector(0.0, 1.1, 2.2); Zmienne typu vector przechowują takie dane jak kierunki poruszania, pozycje obiektów, gracza, przeciwników itp.


3.2 Domyślne typy
event - eventy to coś w stylu sygnałów wysyłanych przez inne skrypty, lub silnik gry, do innych skryptów.
location -
command - polecenie dla obiektu lub npc-a, by wykonał jakąś czynność. Command-y tworzone są poprzez funkcje, które takowe zwracają. Następnym krokiem jest dodanie polecenia do listy naszego celu (który ma polecenie wykonać) za pomocą funkcji AddCommand();
effect -
itemproperty -
player -

Wszystkie powyższe typy przekazywane są za pomocą odpowiednich zmiennych, dzięki czemu za każdym razem, gdy dana funkcja pobiera określony typ, tworzona jest jego kopia. Znaczy to mniej-więcej tyle, że jeśli jakaś funkcja zmienia pewne wartości którejś z powyższych struktur, musi zwrócić zmodyfikowaną wersję.

3.3 Struktury
Jak w każdym sensownym języku skryptowym, także i w tym z Dragon Age: Początek użytkownik może definiować własne struktury. Wykorzystujemy do tego słowo struct:
struct quaternion
{
float w, x, y, z;
};
 
// constructor
struct quaternion Quaternion(float fW, float fX, float fY, float fZ)
{
struct quaternion q;
 
q.w = fW;
q.x = fX;
q.y = fY;
q.z = fZ;
 
return q;
}
 
void main()
{
struct quaternion q = Quaternion(0.0, 0.0, 0.0, 0.0);
}

3.4 Tablice
W skrypcie Dragon Age'a możemy utworzyć tablice każdego typu, z wyjątkiem struktur zdefiniowanych przez użytkowników (co jest sporym utrudnieniem). Autorzy mogą tworzyć tablice zmiennych (int, float, string, itd.), tablice mogą być również zwracane przez funkcje.
Tablice w Dragon Age różnią się nieco od tych znanych np.: z języka C - mogą zmieniać swoje rozmiary. Również sposób ich zapisu wygląda nieco inaczej. Innymi słowy - tablice w Dragon Age bardziej przypominają te znane z J2ME.
Tablice różnią się od zwykłych zmiennych również tym, że przekazując tablicę funkcji, nie podajemy całej tablicy, a jedynie wskaźnik do niej (adres w pamięci komputera, pod którym tablica się znajduje).
A oto i przykładowa tablica elementów typu int:
void main()
{
int[] i; // new array of integers with a size of zero
i[0] = 5; // value of array position 0 is now 5
i[1] = -1; // value of array position 1 is now -1
 
int[] j = i; // i and j point to the same array
j[1] = 12; // value of array position 1 for both i and j is now 12!
 
SortArrayDescending(i); // i and j are both sorted now, this function has no return value
}


4. Funkcje

W Dragon Age ToolSet istnieją dwie metody, na odkrycie funkcji oraz tego co ona robi. Jeśli wpiszesz poprawnie nazwę funkcji i otworzysz nawias, edytor wyświetli mała ściągę, pokazującą jakie typy zmiennych dana funkcja przyjmuje. Druga opcja, to kliknięcie View->Other Windows->Help Window. Dzięki temu po wybraniu dowolnej funkcji z okienka Function Browser, wyświetli się nam opis funkcji.

4.1 Tworzenie własnych funkcji
Nieraz już to robiliśmy, w przypadku funkcji main();. Innymi słowy, aby stworzyć własną funkcją posługujemy się formułką:
zwracany_typ nazwa_funkcji( parametry)
{
     /kod funkcji
}


dla przykładu, mała funkcja, dodająca do siebie dwie zmienne typu całkowitego:
int dodaj(int a, int b)
{
     int wynik;
     wynik = a + b;
     return wynik;
}


Powyższa funkcja zwraca zmienną typu int, stąd też przedrostek int. Jeśli funkcja ma zwracać inne typy, wystarczy zmienić int na inny, np.: float, object itp. Jeśli funkcja nie ma nic zwracać, w miejsce int wpisujemy void. Jak widać, funkcja nosi nazwę "dodaj", nie ma raczej co tutaj tłumaczyć. W nawiasach znajdują się dwa parametry - int a oraz int b. Oznacza to, że funkcja podczas wywoływania pobiera dwie zmienne typu int, które bezwzględnie musimy jej podać.
Oto i przykład zastosowania funkcji:

void main()
{
     int x = 10;
     int y = 20;
     int result;
     result = dodaj(x, y);
}


Funkcja main() tworzy trzy zmienne - x, y oraz result. Zmiennym x oraz y przypisujemy odpowiednie wartości (w tym przypadku 10 i 20). Następnie zmiennej result przypisujemy wynik dodawania zmiennych x i y, obliczony za pomocą funkcji dodaj(); Funkcja dodaj() zwraca bowiem wynik owego dodawania (return wynik;), który zostaje przypisany do zmiennej result. Jak widać, tworzenie własnych funkcji nie jest niczym strasznym, a warto nadmienić że znacznie ułatwia pracę i poprawia przejrzystość kodu.
Należy pamiętać, że funkcja stworzona w jednym skrypcie nie może być użyta w innym. Aby móc z niej korzystać, musimy ją tam po prostu skopiować.

I to, jak na razie, tyle. Oczywiście jest o wiele więcej wiedzy, którą trzeba przyswoić, aby móc tworzyć złożone skrypty, ale na to możnaby poświęcić całą książkę. Polecam jednak się nie poddawać, przeglądać przykłady dodane do ToolSet-a, modyfikować je i sprawdzać efekty. Z czasem wrzucę również kilka przykładowych skryptów wraz z opisami.

Autor: Krossfie
Źródła: http://social.bioware.com/wiki/datoolset/index.php/Scripting_overview

Komentarze (0)
Tylko zarejestrowani użytkownicy mogą pisać komentarze!
 
niedziela, 05. września 2010

Design by: LernVid.com