Nazarian
Administrator
Dołączył: 01 Mar 2008
Posty: 973
Przeczytał: 0 tematów
Pomógł: 12 razy Ostrzeżeń: 0/5 Skąd: Wąchock/Rzeszów
|
Wysłany: Pią 20:41, 05 Wrz 2008 Temat postu: [Podstawy skryptów] Elementarz. |
|
Witam wszystkich zainteresowanych i zapraszam do lektury. W niniejszej lekcji zamierzałem przedstawić, jak napisać skrypt, który pozwoli nam po "użyciu" wspomnianego obiektu 8210 (taka dziura w skale ze schodami w środku) przenieść się o piętro niżej. Pomyślałem jednak, że przyda Wam się pewna elementarna wiedza z dziedziny programowania. Jeśli przeczytacie całość, i nie zrozumiecie nic - pytajcie. Ja po swoim pierwszym kursie programowania nie wiedziałem absolutnie nic. To przychodzi z czasem. Tak więc miłej lektury.
Najpierw słów kilka o skryptach: Przy tworzeniu skryptów dla OTSów pisze się w języku skryptowym LUA. Jest dość prosty, ma niewiele słów kluczowych (tzn. słów, które coś konkretnego w nim robią). W przypadku OTSa ważniejsza jest lista funkcji, przygotowanych przez twórców silnika, które można w skryptach wykorzystać. Zamieszczę ją w osobnym poście. Przy znajomości angielskiego można wydedukować, co dana funkcja robi.
Najpierw zajmę się nieco elementarzem, później wrócę jeszcze do funkcji.
Podstawową jednostką każdego języka programowania (czy to skryptowego czy nie) jest zmienna. Zmienna jest nazwą, pod jaką kryje się jakaś interesująca nas wartość. Jak sama nazwa wskazuje, wartość ta może się zmieniać. Mały przykład:
a = 2
a = a + 1
W pierwszej linijce zmiennej a nadajemy (fachowo nazywa się to przypisaniem) wartość 2. W następnej linijce dodajemy do poprzedniej wartości zmiennej a (czyli dwójki) wartość 1. W rezultacie nasza zmienna będzie mieć wartość 3. Łatwe, prawda?
W zwyczajnych językach programowania są jeszcze stałe - symboliczne nazwy na wartości, których w przeciwieństwie do zmiennych zmieniać nie można. Przykład:
PI = 3.141
Nie wiem jak jest w LUA, w każdym razie C/C++ w takim przypadku zabrania zmiany wartości stałej. Stałe nazywamy zawsze dużymi literami. Tak się przyjęło i należy się tego trzymać dla porządku. Dzięki takiemu trzymaniu się zasad potrafię bez trudu rozczytać kod serwera, mimo że go nie programowałem.
Skoro wiemy już co to zmienna, przejdźmy teraz do funkcji.
Funkcja składa się z trzech rzeczy:
- Nazwy - która jest chyba oczywista . Nie wolno jako nazwy używać słów kluczowych (np. if, then, else, elseif, while, for, do, until, return i jeszcze kilku innych), najlepszym pomysłem, jeśli się nie znamy, jest nazywać funkcje po polsku, jednak BEZ POLSKICH ZNAKÓW!. Nazwa powinna coś mówić o tym, co robi funkcja. Bez tego szybko zginiecie we własnych funkcjach, które zamiast pomagać, będą siały zamęt. W skryptach które dostałem razem z OTSem jest funkcja buy, która jak łatwo się domyślić, służy do kupowania :]. Widzicie więc sami, że warto.
- Argumentów - Tu sprawa jest trudniejsza. Znaczy, nie jest to skomplikowane, ale wymaga pewnego wyjaśnienia. Znów na przykładzie:
Kod: |
function isSorcerer(cid)
if(isPlayer(cid) == FALSE) then
debugPrint("isSorcerer: Player not found.")
return false
end
return (isInArray({1,5}, getPlayerVocation(cid)) == TRUE)
end
|
Nasza funkcja nazywa się isSorcerer - co w dosłownym tłumaczeniu można zamienić na "czy czarodziej?". Jak nietrudno się domyślić, sprawdza ona, czy postać o numerze cid (w serwerze wszystkie stworzenia mają numery, dzięki którym są rozpoznawane - jak kod kreskowy) jest czarodziejem. Cid to właśnie argument funkcji - zmienna, dzięki której możemy funkcji zwrócić uwagę na coś konkretnego. Jeśli jeszcze nie rozumiecie, nic nie szkodzi.
To, co mamy powyżej to tzw. prototyp funkcji - zamiast pisać ją wielokrotnie w każdym miejscu, w którym chcemy żeby się wykonała, możemy zamiast tego używać jej nazwy. Taki prototyp określa, jak funkcja o danej nazwie ma się zachowywać, i wystarczy go przygotować tylko raz. Później, jeśli w naszym skrypcie napiszemy:
isSorcerer(1000)
to serwer sprawdzi, czy gracz o numerze 1000 jest czarodziejem.
No dobra, sprawdzi i co? Tutaj pojawia się trzecia rzecz, która jest związana z funkcją - zwracana wartość. W kodzie naszej funkcji odpowiada za nią słówko kluczowe "return". W przykładowej funkcji użyte jest dwa razy: najpierw linijka
if(isPlayer(cid) == FALSE) then
sprawdza, czy stworzenie o numerze cid jest graczem.
Narazie musicie mi wierzyć na słowo, do warunków jeszcze wrócę.
Jeśli nie, każe funkcji zwrócić false - czyli nieprawdę. To dość logiczne, że jeśli podamy do sprawdzenia numer np. szczura, to raczej trudno przypuszczać, że będzie czarodziejem .
Gdybyśmy chcieli w jakimś momencie zwrócić prawdę - piszemy return true.
Cóż nam to daje? Samo napisanie
isSorcerer(1000)
jest o kant dupy potłuc. Serwer sprawdzi, czy stworzenie o numerze 1000 to czarodziej, ale informacja zostanie od razu zgubiona. Trzeba coś z nią zrobić. Można np. zrobić coś takiego:
a = isSorcerer(1000)
Teraz po wykonaniu tej linijki zmienna a będzie miała wartość true (czyli prawda) jeśli stworzenie o numerze 1000 jest graczem, lub false (fałsz) w przeciwnym wypadku.
Uf. To był zupełny, całkowity elementarz. Po jego przeczytaniu może zrozumiecie, jak napisać skrypt, o którym pisałem na początku. Jeśli macie mętne pojęcie o co mi chodzi, to nic, w pracy na przykładzie wszystko się wyjaśni.
Post został pochwalony 0 razy
Ostatnio zmieniony przez Nazarian dnia Pią 20:42, 05 Wrz 2008, w całości zmieniany 1 raz
|
|