Advertisement
B-Matt

Balkan Coders: Mikey

Jul 11th, 2015
596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.13 KB | None | 0 0
  1. 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!
  2.  
  3. U ovome tutorijalu ću koristiti (programi):
  4. - SA-MP server paket (http://files.sa-mp.com/samp037_svr_R1_win32.zip) - Kako bismo imali Pawno i server paket.
  5. - 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!
  6. - 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.
  7. - JernejL-ov Map Editor (http://www.mathpudding.com/topsecretsamp/editor.rar) - Ovo je proizvoljno. Njega sam koristio za uzimanje pozicije kretnje kornjače.
  8.  
  9. Također ćemo koristiti sljedeće funkcije i objekte:
  10. - Model kornjače (modelid: 1609);
  11. - OnFilterScriptInit() (detaljnije: https://wiki.sa-mp.com/wiki/OnFilterScriptInit) - Ova funkcija se poziva kada se filterskripta učita u server;
  12. - OnFilterScriptExit() (detaljnije: https://wiki.sa-mp.com/wiki/OnFilterScriptExit) - Ova funkcija se poziva kada "izađe" iz servera;
  13. - OnObjectMoved(objectid) (detaljnije: http://wiki.sa-mp.com/wiki/OnObjectMoved) - Ova funkcija služi za detekciju kada neki objekt ZAVRŠI svoje kretanje;
  14. - MoveTurtleToNextPhase() - Proizvoljna funkcija koju smo napisali kako bismo diktirali sljedeći pokret naše kornjače.
  15. - 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.
  16.  
  17. Ovdje ćete naučiti:
  18. - Što su to prekompajl funkcije (#define i #include),
  19. - Što je to varijabla,
  20. - Vrste varijabli,
  21. - Mijenjanje vrijednosti varijabli,
  22. - Što su to polja (arrays),
  23. - Što je to komanda.
  24.  
  25. 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
  26. 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!
  27. 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!
  28.  
  29. 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!
  30.  
  31. -------------------------------
  32. #include <a_samp>
  33. #include <zcmd>
  34. -------------------------------
  35. 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.
  36.  
  37. 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.
  38. - Š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).
  39. - Š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.
  40. 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!
  41.  
  42. -------------------------------
  43. // Defines
  44. #define TURTLE_MOVING_SPEED 0.35
  45. -------------------------------
  46.  
  47. 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.
  48.  
  49. -------------------------------
  50. // Variables
  51. new turtleObject,
  52. movingPhase;
  53. -------------------------------
  54.  
  55. 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)!
  56.  
  57. -------------------------------
  58. new const Float:TurtlePos[ 7 ][ 6 ] = { // Pozicije svih kretnji naše kornjače
  59. { -1995.27356, 84.04118, 26.90000, -2.50000, 0.00000, 0.0000000 }, // 0
  60. { -1995.24792, 88.16576, 26.90000, -2.50000, 0.00000, 0.0000000 }, // 1
  61. { -1995.17358, 93.55340, 26.90000, -2.50000, 0.00000, 270.00000 }, // 2
  62. { -1989.25476, 93.22025, 26.90000, -2.50000, 0.00000, 180.00000 }, // 3
  63. { -1989.54846, 87.84338, 26.90000, -2.50000, 0.00000, 180.00000 }, // 4
  64. { -1989.54846, 87.84338, 26.90000, -2.50000, 0.00000, 180.00000 }, // 5
  65. { -1989.26587, 83.49140, 26.90000, -2.50000, 0.00000, 90.000000 } // 6
  66. };
  67. -------------------------------
  68. 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).
  69.  
  70. 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.
  71. 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.
  72.  
  73. -------------------------------
  74. // Publics
  75. public OnFilterScriptInit()
  76. {
  77. print("========================================");
  78. print("\t\tPomicanje objekata");
  79. print("\tBY: Balkan Coders (B-Matt)");
  80. print("========================================");
  81.  
  82. turtleObject = CreateObject(1609, -1995.27356, 84.04118, 26.90000, -2.50000, 0.00000, 0.00000);
  83. movingPhase = 0;
  84. return 1;
  85. }
  86.  
  87. public OnFilterScriptExit()
  88. {
  89. DestroyObject(turtleObject);
  90. return 1;
  91. }
  92.  
  93. public OnObjectMoved(objectid)
  94. {
  95. if( objectid != INVALID_OBJECT_ID && objectid == turtleObject ) {
  96. MoveTurtleToNextPhase();
  97. }
  98. return 1;
  99. }
  100. -------------------------------
  101. HINT: Za više callbackova koristite SA-MP WIKI: https://wiki.sa-mp.com/wiki/Category:Scripting_Callbacks.
  102.  
  103. 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.
  104. 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.
  105. Idemo sada dodati i našu funkciju "MoveTurtleToNextPhase()" koja će micati Mikeya.
  106.  
  107. -------------------------------
  108. // Stocks
  109. stock MoveTurtleToNextPhase()
  110. {
  111. movingPhase++;
  112. if( movingPhase >= 6 )
  113. movingPhase = 0;
  114.  
  115. MoveObject(turtleObject, TurtlePos[ movingPhase ][ 0 ], TurtlePos[ movingPhase ][ 1 ], TurtlePos[ movingPhase ][ 2 ], TURTLE_MOVING_SPEED, TurtlePos[ movingPhase ][ 3 ], TurtlePos[ movingPhase ][ 4 ], TurtlePos[ movingPhase ][ 5 ]);
  116. return 1;
  117. }
  118. -------------------------------
  119.  
  120. 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.
  121. 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".
  122. 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.
  123. 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);".
  124. Lakše je koristiti polja nego da smo za svaku vrijednost varijable "movingPhase" radili provjere i koristili više puta istu funkciju.
  125. I za završetak imamo još napisati našu komandu koja će pokreniti Mikeyeve kretnje.
  126.  
  127. -------------------------------
  128. // Commands
  129. CMD:mikey(playerid, params[])
  130. {
  131. MoveTurtleToNextPhase();
  132. return 1;
  133. }
  134. -------------------------------
  135.  
  136. 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.
  137. Znači ako ukucamo /mikey move onda bi params[] bio taj parametar upisan nakon komande tj. "move".
  138. 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!
  139. Zapamtite “Ograničenja postoje samo u našim umovima. Ako koristimo maštu, otvaramo si svijet beskonačnih mogućnosti.” - Jamie Paolinetti.
  140.  
  141. ZA ONE KOJI ŽELE ZNATI VIŠE:
  142. 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! :)
  143.  
  144. Posjetite nas: https://www.facebook.com/bacoders
  145. Gas Station Locator: https://gas-locator.com
  146.  
  147. Balkan Coders, B-Matt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement