Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Dobar dan Vam želi Balkan Coders ekipa! Danas ćemo Vam, kroz zabavne i zanimljive ideje, pokazati sve o pomicanju objekata. Kada sam ja učio skriptati ili kodirati onda sam volio da NAPRAVIM nešto, a ne pisati "Hello World" u konzolu. Stoga sam odlučio i ovaj tutorijal napraviti po tome principu. Danas ćemo "oživjeti" kornjaču koja će se realistično i fluidno kretati. Pa krenimo!
- U ovome tutorijalu ću koristiti (programi):
- - SA-MP server paket (http://files.sa-mp.com/samp037_svr_R1_win32.zip) - Kako bismo imali Pawno i server paket.
- - Pawno IDE (dobija se uz server paket) - Njega možete otvoriti tako da raspakirate server paket i odete u pawno folder i kliknete na pawno.exe!
- - Zeex Command Processor (http://forum.sa-mp.com/showthread.php?t=91354) - Ovo koristimo jer je brz, efikasan i lagan! U svega par linija koda se napiše komanda.
- - JernejL-ov Map Editor (http://www.mathpudding.com/topsecretsamp/editor.rar) - Ovo je proizvoljno. Njega sam koristio za uzimanje pozicije kretnje kornjače.
- Također ćemo koristiti sljedeće funkcije i objekte:
- - Model kornjače (modelid: 1609);
- - OnFilterScriptInit() (detaljnije: https://wiki.sa-mp.com/wiki/OnFilterScriptInit) - Ova funkcija se poziva kada se filterskripta učita u server;
- - OnFilterScriptExit() (detaljnije: https://wiki.sa-mp.com/wiki/OnFilterScriptExit) - Ova funkcija se poziva kada "izađe" iz servera;
- - OnObjectMoved(objectid) (detaljnije: http://wiki.sa-mp.com/wiki/OnObjectMoved) - Ova funkcija služi za detekciju kada neki objekt ZAVRŠI svoje kretanje;
- - MoveTurtleToNextPhase() - Proizvoljna funkcija koju smo napisali kako bismo diktirali sljedeći pokret naše kornjače.
- - CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance) (detaljnije: https://wiki.sa-mp.com/wiki/CreateObject) - Ovom funkcijom kreirate objekt na Vašem serveru.
- Ovdje ćete naučiti:
- - Što su to prekompajl funkcije (#define i #include),
- - Što je to varijabla,
- - Vrste varijabli,
- - Mijenjanje vrijednosti varijabli,
- - Što su to polja (arrays),
- - Što je to komanda.
- Za početak ću prestati pisati "kornjača" nego Mikey. Svi smo gledali TMNT i svi znamo tko je taj car. Nakon toga se bacamo na uzimanje koordinata za kretnje našeg Mikeya. Ovako to izgleda kod mene: http://i.imgur.com/gAnImNm.png
- Samo ću prvu kornjaču (onu skroz gore u desnome redu) iskoristiti i stvoriti je na učitavanju filterskripte. Ostale kornjače ćemo iskoristiti za uzimanja pozicija i rotacije za kretnje Mikeya. Kada postavljate sve kornjače na pozicije na koje želite da Mikey ide onda morate uzeti njihove pozicije i rotacije. To se radi tako da kliknete gumb "Show code" u Map Editoru koji će Vam ispisati sve postavljane objekte. Kada sam ja ispisao svoje kornjače onda sam dobio ovaj kod napisan u CreateObject(..): http://i.imgur.com/syS7wnp.png. Nakon toga se bacamo na pisanja naše filterskripte!
- Uđite u Pawn IDE nazvan Pawno te idite u alatnu traku pritisnete "File" pa onda "New" ili jednostavno kliknete CTRL+N. Kada otvorite novi fajl onda dobijete predložak za pisanja filterskripte ili gamemoda koji izgleda ovako: http://i.imgur.com/OyCGq6z.jpg. SVE označite (CTRL+A) i obrišite (Delete/Backscape (strelica iznad Entera)) jer mi krećemo raditi sve od 0!
- Prvo krećemo s "unosom" biblioteka (librarya) ili kako ga mi skripteri volimo zvati include fajlova u našu filterskriptu, a njih unosimo funkcijom "#include" koja poziva te biblioteke. Mi moramo pozvati dvije biblioteke a_samp.inc i zcmd.inc jer ćemo koristiti funkcije iz tih biblioteka. Pa krenimo!
- -------------------------------
- #include <a_samp>
- #include <zcmd>
- -------------------------------
- HINT: Primjetili ste da koristimo znak # ispred funkcije umjesto običnog naziva funkcije? Znak # označava prekompajl funkcije koje se vrše prije samog kompajla odnosno generacije koda iz .pwn u .amx. Kada se završi kompajl tih funkcija onda se kreće na ostatak koda.
- U Map Editoru smo dobili kod za kreiranje tih objekata na serveru, ali nama trebaju pozicije i funkcije. Što sada? Nema frke samo obrišite "CreateObject(1609," i ");" i imate samo pozicije i rotacije. Prije no što krenemo na kreiranje polja odnosno arraya moramo se upoznati s njima i varijablama.
- - Što su to varijable? - Varijable su mjesto u memoriji u koje spremamo naš podatak. On može biti neki cijeli broj (integer), znak (char), realni broj (float) ili skup znakova (string).
- - Što su onda polja? - Polja su više varijabli povezanih imenom i vrstom podatka koju koriste. Primjer takvog polja su "new regTablice[ 10 ];" <- Taj kod će spremiti 10 podataka u poljima od 0 do 9.
- Dodajmo onda naše pozicije i rotacije u našu skriptu. Ja volim na početku "urediti" predložak skripte tako da znam gdje što ide. Po nekakvom pravilu uvijek idem: includes, definicije, globalne varijable, callbackovi (funkcije s public preznakom), moje funkcije i komande. Stoga uvijek stavim komentar (tj. // Varijable) koji se NE KOMPAJLA u vašem modu. Imamo include-ove tj. pozive biblioteka (gledaj gore) onda nam trebaju definicije pa dodajmo ih!
- -------------------------------
- // Defines
- #define TURTLE_MOVING_SPEED 0.35
- -------------------------------
- Ovdje smo definirali brzinu kretnji Mikeya. Definirali smo ju tako da ju možemo lagano mijenjati, a ne tražiti po kodu gdje koristimo te vrijednosti i onda ju mijenjati. Nakon definicije kreću globalne varijable.
- -------------------------------
- // Variables
- new turtleObject,
- movingPhase;
- -------------------------------
- Varijabla se deklarira tako da stavimo njezin tip podatka kakav može primiti i ime te varijable. To smo učinili tako da smo stavili sljedeće: "new turtleObject, movingPhase;". Deklarirali smo dvije varijable koje će primiti CIJELI BROJ. Prvu varijablu "turtleObject" koristiti ćemo za spremanje IDa kojeg dobijemo od kreiranja Mikeya na serveru, a kasnije ćemo taj ID koristiti za njegovo micanje. Druga varijabla je "movingPhase" kojom označujemo na kojoj smo fazi kretanja. Ako je 0 onda smo na početku ili ako smo na 6 onda smo na kraju našeg puta (jer smo uzeli samo 7 pozicija (6 + 1 (jer i 0 je BROJ!) = 7)!
- -------------------------------
- new const Float:TurtlePos[ 7 ][ 6 ] = { // Pozicije svih kretnji naše kornjače
- { -1995.27356, 84.04118, 26.90000, -2.50000, 0.00000, 0.0000000 }, // 0
- { -1995.24792, 88.16576, 26.90000, -2.50000, 0.00000, 0.0000000 }, // 1
- { -1995.17358, 93.55340, 26.90000, -2.50000, 0.00000, 270.00000 }, // 2
- { -1989.25476, 93.22025, 26.90000, -2.50000, 0.00000, 180.00000 }, // 3
- { -1989.54846, 87.84338, 26.90000, -2.50000, 0.00000, 180.00000 }, // 4
- { -1989.54846, 87.84338, 26.90000, -2.50000, 0.00000, 180.00000 }, // 5
- { -1989.26587, 83.49140, 26.90000, -2.50000, 0.00000, 90.000000 } // 6
- };
- -------------------------------
- HINT: Više o poljima možete vidjeti u sljedećem tutorijalu koji je na engleskome: http://forum.sa-mp.com/showthread.php?t=318212 (iPLEOMAX).
- Naše polje smo deklarirali tako da smo napisali: "new const Float:TurtlePos". Deklarirali smo ju da je VARIJABLA (keyword new) koja NE MIJENJA svoju vrijednost (konstanta (keyword const)) i koja prima SAMO REALNE brojeve (Float:), a ime te varijable je "TurtlePos". Ova varijabla postaje polje kada ju deklariramo tako da koristimo ove zagrade [ ] ili u našem slučaju [ 7 ][ 6 ]. To znači da će naša varijabla primiti 42 podatka (7*6=42) koji su raspoređeni u više polja. Izgled polja možete vidjeti ovdje: http://desmond.imageshack.us/Himg824/scaled.php?server=824&filename=61146715.png&res=medium.
- Nakon naših globalnih varijabli stižu nam funkcije napisane u a_samp biblioteci koje nazivamo CALLBACKS. To su posebne funkcije bez kojih skripta komunicira sa serverom, a prepoznatljive su tako što imaju predznak public ispred sebe. Mi ćemo koristiti svega 3 callbacka, a to su: OnFilterScriptInit, OnFilterScriptExit i OnObjectMoved. Unesimo i njih u našu filterskriptu.
- -------------------------------
- // Publics
- public OnFilterScriptInit()
- {
- print("========================================");
- print("\t\tPomicanje objekata");
- print("\tBY: Balkan Coders (B-Matt)");
- print("========================================");
- turtleObject = CreateObject(1609, -1995.27356, 84.04118, 26.90000, -2.50000, 0.00000, 0.00000);
- movingPhase = 0;
- return 1;
- }
- public OnFilterScriptExit()
- {
- DestroyObject(turtleObject);
- return 1;
- }
- public OnObjectMoved(objectid)
- {
- if( objectid != INVALID_OBJECT_ID && objectid == turtleObject ) {
- MoveTurtleToNextPhase();
- }
- return 1;
- }
- -------------------------------
- HINT: Za više callbackova koristite SA-MP WIKI: https://wiki.sa-mp.com/wiki/Category:Scripting_Callbacks.
- Kao što sam već rekao OnFilterScriptInit se poziva kada se filterskripta učita u server. Tu smo stavili da se kreira Mikey, stavili smo njegovu fazu kretanja na nulu i da ispiše poruku. Kada se skripta unloada sa servera onda treba obrisati Mikeya inače bi ostao na serveru.
- Sljedeći callback je OnObjectMoved koji se javlja kada se završi kretanje objekta. U njoj imamo dvije provjere: prva provjera je dali je ID objekta, koji je završio pomicanje, zapravo na serveru, druga provjera je dali je to naš Mikey. Ako je to dobar objekt i naš Mikey onda ga idemo pomaknuti u drugu fazu.
- Idemo sada dodati i našu funkciju "MoveTurtleToNextPhase()" koja će micati Mikeya.
- -------------------------------
- // Stocks
- stock MoveTurtleToNextPhase()
- {
- movingPhase++;
- if( movingPhase >= 6 )
- movingPhase = 0;
- MoveObject(turtleObject, TurtlePos[ movingPhase ][ 0 ], TurtlePos[ movingPhase ][ 1 ], TurtlePos[ movingPhase ][ 2 ], TURTLE_MOVING_SPEED, TurtlePos[ movingPhase ][ 3 ], TurtlePos[ movingPhase ][ 4 ], TurtlePos[ movingPhase ][ 5 ]);
- return 1;
- }
- -------------------------------
- Ovdje imamo "movingPhase++;" što znači povećanje vrijednosti cijelog broja u varijabli movingPhase za jednu vrijednost. Nakon toga provjeravamo dali je vrijednost te varijable veća ili jednaka (">=") broju 6 (najvećem indeksu u našem polju), ako je onda neka varijablu resetira na 0 odnosno vrati na početno stanje kretanja.
- I kao zadnje koristimo funkciju "MoveObject" koja uzima ID objekta Mikeya (turtleObject) i pomiče ga na koordinate i rotacije iz našeg polja brzinom definirano na vrhu skripte s "TURTLE_MOVING_SPEED".
- Ovdje se pokazuje zašto smo koristili varijablu "movingPhase". Ona označava koji ćemo redak u polju čitati (to je ona prva uglata zagrada []), a ovi indeksi nakon toga označavaju koju vrijednost u tome retku.
- Naprimjer ako uzmemo da je varijabla movingPhase = 1 onda ćemo dobiti ove vrijednosti: "MoveObject(turtleObject, -1995.24792, 88.16576, 26.90000, 0.35, -2.50000, 0.00000, 0.0000000);".
- Lakše je koristiti polja nego da smo za svaku vrijednost varijable "movingPhase" radili provjere i koristili više puta istu funkciju.
- I za završetak imamo još napisati našu komandu koja će pokreniti Mikeyeve kretnje.
- -------------------------------
- // Commands
- CMD:mikey(playerid, params[])
- {
- MoveTurtleToNextPhase();
- return 1;
- }
- -------------------------------
- Kao što sam već rekao ZCMD je jako lagan. U svega par linija koda dobijete ovo "/mikey". Parametar playerid označava od igrača ID koji je koristio komandu /mikey. Dok parametar params[] označava ono što ste napisali nakon naziva komande odnosno ono nakon "mikey" u komandi /mikey.
- Znači ako ukucamo /mikey move onda bi params[] bio taj parametar upisan nakon komande tj. "move".
- Ovo je prvi jednostavni tutorijal o kretanju objekata. Naravno Vi možete napraviti još realnije Mikeyeve kretnje da bude sporiji ili da prati igrača, ali to ostavljamo Vama na maštu mi smo Vam pokazali osnove i kako!
- Zapamtite “Ograničenja postoje samo u našim umovima. Ako koristimo maštu, otvaramo si svijet beskonačnih mogućnosti.” - Jamie Paolinetti.
- ZA ONE KOJI ŽELE ZNATI VIŠE:
- Pokušajte koristeći timere (https://wiki.sa-mp.com/wiki/SetTimerEx) i GetPlayerPos(https://wiki.sa-mp.com/wiki/GetPlayerPos) napraviti da Mikey prati Vas! Ako uspijete ovo iskriptati onda nam postajte slike ili videe u komentar! :)
- Posjetite nas: https://www.facebook.com/bacoders
- Gas Station Locator: https://gas-locator.com
- Balkan Coders, B-Matt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement