zysk
Administrator
Dołączył: 26 Sty 2006
Posty: 49
Przeczytał: 0 tematów
|
Wysłany: 2006/02/11 20:21 Temat postu: [Skrypty] Opis |
|
|
Nie będzie to niestety kurs, a raczej informacje o składni skryptów
1. Zmienne i stałe (wartości):
Aby używać wartości należy ją zadeklarować:
Kod: |
var typ nazwa;
const typ nazwa = wartość_początkowa;
|
var dla zmiennych
const dla stałych
W ten sposób tworzymy wartość typu "typ" (najczęściej int-liczba całkowta, choć mogą być inne np. string-łańcuch znaków) o nazwie "nazwa" (po której będziemy się do zmiennej odwoływać) i zawierającą na początku "wartość_początkowa". Jeśli zmienną deklarujemy w miejscu poza wszelkimi funkcjami to będzie to wartość globalna dostępna wszędzie, w przeciwnym wypadku będzie usunięta po wyjściu z przedziału wyznaczonego przez operatory '{' i '}'.
Przykłady:
Kod: |
var int Kapitel;
const int DurstigeBauern = 10;
|
Istnieje jeszcze możliwość tworzenia tablic zmiennych:
Kod: |
var typ nazwa[ilość];
|
Ilość określa jak duża będzie tablica. W ten sposób powastają nam zmienne:
Kod: |
var typ nazwa[0];
var typ nazwa[1];
...
var typ nazwa[ilość-1];
|
Jak widać są one numerowane od zera.
2. Operatory i wyrażenia warunkowe
Operatory wstawiamy pomiędzy dwie wartości (dwuargumentowe) lub przed konkretną wartością (jednoargumentowe).
Pierwszym jaki poznamy będzie operator przypisania:
Operator ten, jak sama nazwa wskazuje przypisuje zmiennej "zmienna", wartość "wartość".
Następnie mamy pięć podstawowych działań:
Kod: |
(wartość_a+wartość_b)
(wartość_a-wartość_b)
(wartość_a*wartość_b)
(wartość_a/wartość_b)
(wartość_a%wartość_b)//Modulo, reszta z dzielenia |
Jak się tego używa? Naprzykład można:
W ten sposób zmiennej 'a' przypiszemy sumę liczb 'b' i 'c'.
Za chwilę poznamy operatory porównania, natomiast pozostałe poznamy przy okazji flag bitowych.
Oto jak wygląda wyrażenie warunkowe:
Kod: |
if (warunek)
{
...
//instrukcje gdy spełniony
...
};
|
lub
Kod: |
if (warunek)
{
...
//instrukcje gdy spełniony
...
}//tu nie ma średnika
else
{
...
//instrukcje gdy nie spełniony
...
}; |
Teraz tylko trzeba wiedzieć, jak określić warunek. Pierwszym sposobem jest podanie liczby, wtedy warunek będzie spełniony gdy owa wartość będzie niezerowa. Drugim sposobem jest użycie operatorów porównania:
Kod: |
(wartość_a==wartość_b) //Uwaga! Gdy pomylimy z operatorem przypisania, nie dostaniemy nawet komunikatu o błędzie!
(wartość_a!=wartość_b) //nierówne
(wartość_a>=wartość_b)//większe lub równe
(wartość_a<=wartość_b)
(wartość_a<wartość_b)
(wartość_a>wartość_b)
//Wyrażenie (wartość_a>wartość_b>wartość_c) NIE jest poprawne. |
Możemy jeszcze wykonywać działania na warunkach:
Kod: |
(!warunek)//Negacja, prawdziwe wtedy i tylko gdy "warunek" nie jest spełniony.
(warunek_a&&warunek_b)//Koniunkcja, prawdziwe wtedy i tylko wtedy, gdy oba warunki są spełnione
(warunek_a||warunek_b)//Alternatywa, prawdziwe wtedy, gdy conajmniej jeden warunek jest spełniony. |
Kolejność działań zmieniamy tak jak w matematyce, wstawiając nawiasy.
Przykłady:
Kod: |
a=2*(b+c);//przypisz a wartość
((a<b)&&(b<c))//sprawdź, czy a<b<c
(a||b)//sprawdź, czy przynajmniej jedna z tych wartości jest różna od zera
a=-b; |
3. Funkcje
Funkcje zawierają wszystkie skryptowe instrukcje jakie Gothic przetwarza podczas gry, więc trzeba umieć się nimi posługiwać. Funkcje przyjmują pewną ilość parametrów (może być zerowa) i zwracają pewien typ danych (może być pustka (void)). Definicja funkcji wygląda następująco:
Kod: |
func typ_wartości_zwracanej nazwa(var typ_a zmienna_a,var typ_b zmienna_b...)
{
...
instrukcje
...
}; |
Funkcja może wewnątrz siebie używać tylko wartości globalnych, parametrów tej funkcji i zmiennych zadeklarowanych wewnątrz tej funkcji (a ściślej tego wywołania tej funkcji). Parametry są nowymi zmiennymi, kopiami wartości podanych podczas wywołania, więc zmienianie ich nie wpłynie na te zmienne.
Jeżeli funkcja ma zwracać jakąś niepustą wartość należy użyć w jej ciele instrukcji return:
Kod: |
return wartość_zwracana; |
Oczywiście "wartość_zwracana" musi być typu "typ_wartości_zwracanej". Tej funkcji można użyć w następujący sposób:
Kod: |
nazwa(wartość_a,wartość_b...) |
Uwaga! Nawet jeśli funkcja ma zerową ilość parametrów wpisujemy nawias otwierający i zamykający.
Teraz pora na konkretniejszy przykład:
Kod: |
var int tab[3];
func int zmiana(var int a, var int b)
{
a=a+2;
return b+4;
};
/*
...
*/
tab[0]=2;
tab[1]=3;
tab[2]=zmiana(tab[0],tab[1]);
|
Po wywołaniu ostatnich instrukcji tab[0]=2, tab[1]=3, tab[2]=7. tab[0] się nie zmienia ponieważ zmienialiśmy tylko parametr funkcji, a nie to skąd ten parametr wzięliśmy. tab[2] jest równe 7 ponieważ przypisaliśmy mu wartość zwracaną przez funkcję.
Jeżeli nie chcemy nic robić z wartością zwracaną przez funkcję (np. gdy to jest pustka) wtedy możemy wywołać funkcję tak
Czasem używamy jednak nazwy funkcji bez nawiasów. Jest to wtedy, gdy chcemy przekazać nie wartość zwracaną przez funkcję, ale samą funkcję (tak naprawdę to jej adres). Takim przypadkiem jest obiekt rozmowy, któremu przekazujemy, aż 2 funkcje, ale o tym kiedy indziej.
4. Klasy i obiekty
Wszystkie klasy są zdefiniowane w _intern\classes.d, ale nas będą interesować tylko c_item, c_info, c_npc. Niezależnie od tego jaką klasą się posługujemy należy zdefiniować instancję - w przypadku c_item charakteryzuje ona jeden rodzaj przedmiotów (np. Smażone mięso), w wypadku c_info jeden temat (dialog), natomiast c_npc jeden rodzaj istot (np. Szkielet-wojownik (wszyscy mają tę samą), Szkielet maga z wieży mgieł, Gorn, Ścierwojad (wszystkie mają tą samą), każdy Szkodnik ma oddzielną).
Ogólnie instancję definiujemy tak:
Kod: |
instance nazwa_instancji (klasa)
{
//Czynności wykonywane przy tworzeniu obiektu
}; |
W przypadku c_info to czynności to jedynie przypisanie polom obiektu odpowiednich wartości, a stworzenie instancji to wszystko co trzeba zrobić (poza zdefiniowaniem funkcji wywoływanych przez obiekt. W tym przypadku można również modyfikować instancję:
Kod: |
nazwa_instancji.pole=wartość; |
W pozostałych przypadkach (c_item i c_npc) należy jeszcze wprowadzić obiekt (lub obiekty) danej instancji do gry.
Obiekty z c_item można wstawiać w Spacerze, można różnymi funkcjami, najczęściej CreateInvItem. Omówimy ją później gdyż dotyczy c_npc, których zbyt dobrze nie znamy.
Natomiast z klasy c_npc wprowadzamy funkcją Wld_InsertNpc, którą wywołujemy następująco:
Kod: |
wld_insertnpc(instancja,waypoint); //Waypointy ustawiamy w Spacerze, nazwę (w funkcji) należy poprzedzić i zakończyś cudzysłowem (ponieważ jest to łańcuch znaków - string). |
Podczas gry oba można stworzyć przy pomocy konsoli, pisząc "insert instancja".
Można również posługiwać się konkretnymi postaciami, definiujemy zmienną zawierającą postać:
Następnie ustawiamy na istotę danej instancji:
Kod: |
postac=Hlp_GetNpc(instancja); |
Możemy jej teraz użyć w różnych fukcjach np. we wspomnianej funkcji CreateInvItem:
Kod: |
createinvitem(postac,instancja_przedmiotu); |
Podczas wstawiania postaci jest ona (wstawiana postać) przechowywana w zmiennej self, co pozwala na przekazanie jej do funkcji np. ustawiających model, nie znam się na tym za bardzo, więc nie będę ich opisywał.
Post został pochwalony 0 razy
|
|