Programavimo pagrindai

Iš GTA-Online Wikipedia.
Peršokti į: navigaciją, paiešką
Autorius: Blantas
2012-05-21

Turinys

Pradžia

Kuriant San Andreas Multiplayer serverį išvengti programavimo būna sunku, kadangi jo prireikia įgyvendinant savo tikslus visais atvejais. Įvardydamas žodžius „visais atvejais“ norėjau pasakyti, jog serverį valdo kelių rūšių dalys. Kiekviena iš jų yra atsakingu už tam tikrus dalykus. Štai visų jų sąrašas:

  • gamemode'ai
  • filterscript'ai
  • npcmode'ai

Gamemode'ai

Gamemode'as yra turbūt svarbiausia serverio dalis, kadangi be jos serverio sukurti neįmanoma. Gamemode'o pagrindinė paskirtis yra valdyti beveik visus serveryje vykstančius procesus, kuriuos įtakoja tiek serveryje esantys žaidėjai, tiek pašaliniai veiksniai.

Filterscript'ai

Filterscript'as - tai papildoma serverio dalis, kuri šiek tiek panaši į gamemode'ą, kadangi jame įmanoma valdyti taipogi daugumą procesų. Esminis dalykas, skiriantis filterscript'ą nuo gamemode'o yra tas, jog filterscript'ą įmanoma įjungti bei išjungti bet kokiu metu. Atjungus filterscript'ą serveris toliau veiks, kadangi visi pagrindiniai valdymo procesai vyksta gamemode'e. Kitas dalykas, kuo filterscript'as skiriasi nuo gamemode'o yra tas, jog filterscript'ų serveryje vienu metu gali būti įjungtų daugiau nei vienas. Visa tai suteikia gana patogų dinaminį serverio valdymo, kadangi norimu metu, galima atjungti atskiras serverio dalis, nesustabdant pačio serverio veikimo. Dažniausia filterscript'uose talpinama informacija skirta valdyti procesams tiesiogiai nesusijusiais su esamais gamemode'e, tačiau pasitaiko ir tokių atvejų, kai filterscript'ai bei gamemode'ai yra surišti naudojant specialias funkcijas perduoti informacijai iš vienos serverio dalies (šiuo atveju filterscript'o) į kitą (gamemode'ą).

Npcmode'ai

Npcmode'as - tai viena iš serverio dalių, kuri nepasižymi didele reikšme bendram serverio valdymui. Npcmode'as skirtas kontroliuoti procesams su serverio sukurtais bei valdomais žaidėjais (ang. „NPC“ - „Non-player character“). Sukūrus vieną serverio valdomą virtualų žaidėją, jam prireiks ir specialaus npcmode'o, kuriame aprašyti sukurto žaidėjo veiksmai.

Išeitinis kodas

Išeitinis kodas - tai tekstas užrašytas programavimo kalba. Šis terminas ir apibrėžia asmens parašytą tekstą, atliekant programavimo procesą. Žemiau esantis tekstas yra vienas iš paprasčiausių išeitinių kodų, kuriuos įmanoma parašyti:

  1. #include <a_samp>
  2.  
  3. main()
  4. {
  5. 	print("Sveikas pasauli!");
  6. 	return 1;
  7. }

Aptarsime visus matomus teksto elementus iš eilės.

Bibliotekos

Pirmoje eilutė (žalios spalvos šriftas) nurodo, jog programuojamame kode bus naudojama biblioteka „a_samp“, t.y. tam tikrų funkcijų rinkinys. Kiekviena biblioteka suteikia papildomų galimybių būsimai programai (mūsų atveju - serveriui). Biblioteka „a_samp“ - tai visų SA-MP modifikacijos funkcijų rinkinys. Kadangi nurodėme, jog ši biblioteka bus naudojama, todėl galime naudoti visas funkcijas skirtas valdyti serverį.

Aprašas

Šiame žingsnyje aptarsime šias pažymėtas išeitinio kodo dalis:

  1. #include <a_samp>
  2.  
  3. main()
  4. {
  5. 	print("Sveikas pasauli!");
  6. 	return 1;
  7. }

Šiose eilutės parašyta tekstas nurodo, jog bus aprašoma funkcijos „main“ veikimas, t.y. tai kas vyks šioje funkcijoje. Aprašant kiekvieną funkciją, būtina nurodyti jos tikslų pavadinimą su visais parametrais (funkcijos parametrus, argumentus, aptarsime vėliau). Pirmieji figūriniai skliaustai (eilutė 4) nurodo, jog toliau esančiose eilutėse bus aprašomas funkcijos vidus (veiksmai), o antrieji figūriniai skliaustai (eilutė 7), jog šioje vietoje baigiasi funkcijos „main“ vidus, t.y. toliau esančiose eilutės būsimi veiksmai nepriklausys funkcijai „main“.

Iškvietimas

Dabar panagrinėsime patį funkcijos vidų, t.y. tai kas yra tarp figūrinių skliaustų aptartų ankstesniame žingsnyje.

  1. #include <a_samp>
  2.  
  3. main()
  4. {
  5. 	print("Sveikas pasauli!");
  6. 	return 1;
  7. }

Paryškintoji eilutė (eilutė 5) yra sakinys, kuris kreipiasi į funkciją „print“, kuri atspausdina norimą tekstą (ši funkcija yra viena iš SA-MP funkcijų, todėl ir naudojame biblioteką „a_samp“). Atkreipkite dėmesį, jog kiekvieno sakinio galą žymi kabliataškio simbolis. Ši eilutė yra elementarus pavyzdys, kaip naudoti norimą funkciją.

Antroji paryškintoji eilutė (eilutė 6) nurodo grąžinamąją reikšmę, kuri lygi vienetui. Ši reikšmė bus grąžinama tam, kas iškvietė funkciją „main“. Norint geriau suprasti grąžinamosios reikšmės prasmę, galima įsivaizduoti situaciją realybėje tarp kelių draugų. Draugas A paklausė draugo B, kiek šiuo metu yra valandų, kadangi draugas B atsakymo nežinojo, jis šį klausimą uždavė draugui C. Draugas C pasakė tikslų laiką draugui B, o šis draugui A. Šiuo atveju, laikas ir yra grąžinamoji reikšmė, kuri grąžinama tam, kas jos prašė. Aptariamame pavyzdyje, serveris iškviečia funkciją „main“ ir prašo grąžinti tam tikrą reikšmę. Funkcijos „main“ viduje nustatoma grąžinamoji reikšmė į vienetą ir ji perduodama serveriui.

Taigi, serveriui vykdant funkciją „main“ bus įvykdomi visi veiksmai aprašyti tarp figūrinių skliaustų. Pirmiausia iškviečiam funkcija „print“ iš „a_samp“ bibliotekos, o vėliau ir grąžinama reikšmė, tam kas iškvietė funkciją „main“.

Sakiniai

Mūsų nagrinėjamo kodo struktūra yra turbūt viena iš paprasčiausių bei labiausiai naudojamų, tačiau visa tai įmanoma užrašyti ir kitais būdais.

Pirmajame pavyzdyje kiekviena eilutė atlieka atskirą veiksmą, taip parašytas išeitinis kodas yra paprasčiau suprantamas, nei užrašytas tokiu būdu:

  1. #include <a_samp>
  2.  
  3. main() { print("Sveikas pasauli!"); return 1; }

Rašant tokio tipo struktūras, svarbu nepamiršti panaudoti figūrinių skliaustų, nurodant, kuri kodo dalis turėtų būti vykdoma kartu. Netaisyklingo kodo pavyzdys:

  1. #include <a_samp>
  2.  
  3. main() print("Sveikas pasauli!"); return 1;

Šį kartą funkciją „main“ sudaro tik funkcijos „print“ iškvietimas, o grąžinamoji reikšmė yra panaudojama netinkamai. Visa tai yra tas pats kas:

  1. #include <a_samp>
  2.  
  3. main() print("Sveikas pasauli!"); 
  4. return 1;

Arba...

  1. #include <a_samp>
  2.  
  3. main() 
  4. {
  5. 	print("Sveikas pasauli!");
  6. }
  7. return 1;

Funkcijos

Funkcija yra tam tikra kodo dalis, kuri gali būti vykdoma įvairiose išeitinio kodo vietose.

Apibrėžimas

Funkcijos kūrimas yra gana elementarus procesas. Kadangi šio straipsnio pirmajame nagrinėtame pavyzdyje tyrėme funkciją „main“, tai apibrėžti naują funkciją turėtų būti gana paprasta. Kiekviena funkcija apibrėžiama nurodant jos pavadinimą, parametrus bei jos struktūrą, kurią rašome tarp figūrinių skliaustų. Pavyzdžiui:

ManoFunkcija()
{
	print("Sveikas pasauli!");
}

Nuo šiol turėdami tokios funkcijos aprašą, ją galime iškviesti bet kurioje kitoje funkcijoje, pavyzdžiui:

  1. #include <a_samp>
  2.  
  3. main() 
  4. {
  5. 	ManoFunkcija();
  6. 	return 1;
  7. }
  8.  
  9. ManoFunkcija()
  10. {
  11. 	print("Sveikas pasauli!");
  12. }

Paryškintoji eilutė (eilutė 5) nurodo, jog serveris iškviestų funkciją „ManoFunkcija“ bei vykdytų šios funkcijos viduje aprašytus procesus, kurie nurodyti ties 10 bei 12 eilutėmis.

Šiek tiek sudėtingesnis pavyzdys:

  1. #include <a_samp>
  2.  
  3. main() 
  4. {
  5. 	return ManoFunkcija();
  6. }
  7.  
  8. ManoFunkcija()
  9. {
  10. 	print("Sveikas pasauli!");
  11. 	return 1;
  12. }

Šį kartą funkcijos „main“ grąžinamoji reikšmė priklauso nuo to, kokią reikšmę grąžins funkcija „ManoFunkcija“. Nagrinėjant naująją funkciją atidžiau, matome, jog funkcija nuo šiol turi grąžinamąją reikšmę, kuri lygi vienetui. Taigi įvykdant funkciją „ManoFunkcija“, paryškintoje eilutėje vietoj funkcijos pavadinimo atsiras skaičius, kurį grąžino ši funkcija (vienetas).

  1. 	return ManoFunkcija();

Taps į:

  1. 	return 1;

Parametrai

Kiekviena funkcija tampa sudėtingesnė jei joje yra bent vienas parametras. Parametras - tai kintamasis, kurį galima naudoti funkcijoje jo nekuriant iš naujo. Pavyzdžiui:

ManoFunkcija(tekstas[])
{
	print(tekstas);
}

Šiuo atveju, funkcijoje atsiranda kintamasis pavadinimu „tekstas“, kurį galime naudoti visame funkcijose apraše. Laužtiniai skliaustai po parametro pavadinimo nurodo, jog šis parametras bus teksto pavidalo, t.y. jį sudarys bet kokių simbolių rinkinys. Nuo šiol į funkciją „ManoFunkcija“ privalėsime kreiptis tokiu pavidalu, jog nurodytume ir jos parametrus:

ManoFunkcija("Koks nors tekstas");

Iškvietus šią funkciją, jos parametras, kurio reikšmė yra „Koks nors tekstas“, bus perduodamas funkcijai „print“, kaip jos funkcijos parametras. Funkcija „print“ gautąjį tekstą atspausdins. Pilnas pavyzdys su funkcija bei parametrais:

  1. #include <a_samp>
  2.  
  3. main() 
  4. {
  5. 	ManoFunkcija("Koks nors tekstas");
  6. 	return 1;
  7. }
  8.  
  9. ManoFunkcija(tekstas[])
  10. {
  11. 	print(tekstas);
  12. }

Jei funkcija turi daugiau nei vieną parametrą, jie yra atskiriami kablelio simboliu. Pavyzdyje su keliais funkcijos parametrais sukursime funkciją, kuri atspausdins norimą tekstą, bei grąžins pasirinktą reikšmę - skaičių. Funkcijos aprašas atrodys taip:

ManoFunkcija(tekstas[], reiksme)
{
	print(tekstas);
	return reiksme;
}

Šiame pavyzdyje vienas parametrų nurodo grąžinamąją reikšmę, t.y. kokį skaičių parašysime iškviesdami funkciją, tokį skaičių funkcija ir grąžins.

  1. #include <a_samp>
  2.  
  3. main() 
  4. {
  5. 	return ManoFunkcija("Koks nors tekstas", 1);
  6. }
  7.  
  8. ManoFunkcija(tekstas[], reiksme)
  9. {
  10. 	print(tekstas);
  11. 	return reiksme;
  12. }

Taigi, funkcija „main“ grąžina tokią reikšmę, kokią grąžina funkcija „ManoFunkcija“. Šios sukurtos funkcijos grąžinamoji reikšmė priklauso nuo to, kokia jos parametro „reiksme“ reikšmė. Paryškintoje eilutė (eilutė 5) bekviesdami funkciją mes nurodėme, jog būtų atspausdintas tekstas „Koks nors tekstas“ bei, jog būtų grąžinta reikšmė lygi vienetui.

Kintamieji

Asmeniniai įrankiai
San Andreas Multiplayer