Szerző Téma: Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.  (Megtekintve 5120 alkalommal)

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Dátum: 2013. November 09. - 16:43:44 »
+8
Bevezetõ
Üdv!

Ennek a leírásnak a lényege igazából az, hogy megismertessem a kezdõ scriptereket a PAWN nyelv tényleg alapjaival, valamint megmutassam nekik, hogy hogyan lehet a kódunkat elrendezni. Részben azért is készült mert sokan ezekkel a problémákkal kerestek fel skypeon és mostantól, hogy nekem se kelljen annyit írnom csak belinkelem nekik ezt. Remélem érthetõen magyarázok majd próbálom a lehetõ legérthetõbb módon leírni gondolataimat és fogalmakat, mivel tudom magamról hogy én se értettem mindig meg a dolgokat. Na vágjunk bele :D

Alap fogalmak
Mielõtt belevágnánk úgy gondoltam, hogy az úgynevezett \"szakszavakat\" összegyûjtöm itt, hogy mindenki értse, hogy mit jelentenek, mint egy szótárban kb.



includeok - Az includeokat úgy írhatnám le, mint könyvtárak amik magába foglalja a függvényeket, eljárásokat, PAWN változókat, idõzítõket, ciklusokat egyszóval mindent, ez az
#include 

a SA:MP könyvtára, ezt feltétlenül be kell írjuk ahhoz, hogy mi SA:MP-ban tudjunk \"programozni\", ez az alap include, ami nélkül semmit se tudunk csinálni PAWN-ban.

Léteznek úgynevezett \'parancsfeldolgozók\' ami már egy külön könyvtár és \'karakterdarabolók\' ami szintén egy másik könyvtárnak tudhatóak be. A parancsfeldolgozók könyvtárából általában egyet szoktunk használni a ZCMD-t és a karakterdarabolóktól pedig az sscanf-ot. A két includeról bõvebben
ide kattintva olvashatsz.

Ha netán nem értetted meg a mondanivalóm legegyszerûbben úgy mondhatom el, hogy ahhoz, hogy te több könyvet elolvass több könyvtárba kell járj, ahhoz hogy te több mindent csinálhass az PAWN nyelvben több includeot kell használj ami által több funkciót kapsz.




defineok - Ezeket magyarul definálásnak nevezzük. Példának egy gyakori használatát hoznám fel: sokan láthattátok, hogy például ilyen szerepel a kódban:
#define FEHER -1


#define - Ezzel jelezzük azt, hogy mi valamit definiálni akarunk


FEHER - Ez azt jelenti, hogy a -1 színt a kódunk úgy is elfogadja, hogy ha azt írjuk a módunkba, hogy FEHER. Egyszóval a \"gép\" mindkét variánst elfogadja és nem jelzi ki hibásan, ha azt írjuk, hogy FEHER.


\"-1\" egy színkód, például amikor felmész a szerverre és az üdvözlõ üzenet fehérrel van leírva akkor ezt a színkódot használták.


Most biztos azt kérdezitek magatoktól, hogy minek defináljuk a -1-et hisz simán észben tartható szín. Valóban tényleg könnyû megjegyezni ez egy könnyû színkód volt viszont amikor a narancssárga színkódja az, hogy 0xc4a321AA ugye azt már nem tudjuk megjegyezni, fõleg ha van 20 különbözõ színünk és 20 különbözõ ilyen színkódunk :) Ezért érdemes ilyenkor definálni.


A definálásnak persze még több haszna is van (dialogoknál, ID-knál, változóknál, munkáknál stb.), de úgy vélem aki most kezdte ezt a nyelvet ennyi lecke neki mára elég.


Ahhoz, hogy színeket keverhess
kattints ide



stock és forward - Most biztos sokan megfognak érte kövezni de az egyszerûség kedvéért mondom így: A forward arra való, hogy saját eljárásokat hozzunk létre, a stock pedig arra, hogy saját függvényeket.

Akinek van egy kevéske angol tudása az
ide kattintva  láthat példákat, valamint az illetõ elég jól leírja, hogy miért használjuk ezeket.



változók és globális változók - Ahhoz, hogy megértsétek a globális változókat elõször a változókat írnám le röviden.

6 változó fajta található a PAWN nyelvben


i = integer,egész szám (-1, 15 stb)
s = string,karakterlánc (\"a stringet mindig macskakörömbe kell rakni\", \"a string az adott szöveg\")
d = Lásd: i
a = array,Tömb,a következõ paraméter egy szám kell legyen,az a tömb mérete. (new tomb[12]; new masiktomb[24])
b = bolean,tehát csak igaz/hamis érték lehet ( 0 - hamis, 1 - igaz)
f = float,valós,lebegõpontos szám.(Tört,pl. 0.23)

 

A változók olyanok, mint a matematikában az összeadás, kivonás, szorzás, osztás. Változók nélkül a PAWN nyelvben se lehet programozni és egy adott függvény paramétereinél mindig meg van szabva, hogy melyik változó típust kell használnod, teszem azt
SendClientMessage(playerid, -1, \"Idézõ jelbe leírtam, hogy stringet rakunk, azaz ez lesz a szöveg\");

 

Itt az idézõ jelben lévõ szöveget fogja elküldeni a megadott játékosnak fehér színûen (mert ugyebár tudjuk, hogy a -1 az színkód :) )

Bõvebben a változókról valamint egy nagyon jó alap a kezdõk számára Chuck Norris által írt témában olvashattok, amit
ide kattintva érhettek el.

globális változók - A globális változók ugyan azt tudják, mint a rendes változók azt leszámítva, hogy egy globális változónak megadunk egy értéket és azt az adott értéket nem csak egy eljárásnál használhatjuk hanem akár az összesnél.

Köznapi alkalmazásban ezt úgy mondanám, hogy van egy cikk csokid például (ez lesz a sima változónk)  ezt a cikk csokit csak egy szobában ehetjük meg (a sima változót csak egy funkciónál használhatjuk), ám ha van egy extra mogyorós csokid (azaz globális változód) akkor azt az extra mogyorós csokit bármelyik szobában megeheted ( a globális változót bárhol felhasználhatod).


Azt, hogy hogyan emeljük ki a globális változót arról lent fogok írni.




enums - Ezeket magyarul enumerátoroknak nevezzük.

Úgy kell elképzelni, mint egy nagy szekrény benne fiókokkal, a fiókok mindegyikében valamilyen tárgy van. Na az enumerátorok is ilyenek, egy nagy \"tömb\" amiben tárolók vannak ahová az adatokat tárolhatjuk.


Az enumerátorokról és a bennük lévõ adatok eltárolásáról bõvebben
itt olvashattok.



függvények és eljárások -A samp include (amirõl feljebb is írtam) összesen 419 darab függvényt és 65 darab eljárást tartalmaz.

És hogy mik is ezek? Úgy vélem ezt Chuck a lehetõ legjobb módon magyarázta el.



Eljárás = Minden eljárás függvény,de nem minden függvény eljárás.Eljárásnak nevezzük azokat a függvényeket,amik public kulcsszóval kezdõdnek és általában egy értéket adnak vissza,feladatot látnak el.A beépített fügvények a megfelelõ alkalmakkor lépnek mûködésbe.Pl. OnPlayerText ha a játékos ír a chatbe,stb...[/quote]

Ehhez csak annyit fûznék hozzá, hogy függvények és eljárások kölcsönös kombinációjával érhetjük el azt amit valóban szeretnénk a SA:MP-ban csinálni, és épp ez a legjobb ebben a nyelvben, hogy vajon hogyan kombinálj össze és milyen függvényeket ahhoz, hogy a végén meglegyen a kívánt kódod. És ha sikerül igazán Epic Win érzése van az embernek :D


Boncolgathatnám a témát napestig meg mutathatnám példával, hogy hogyan kell kódokat kihozni de igazából ezt és mint minden programozási nyelvet úgy tudsz csak megtanulni, ha van türelmed leseggelsz a monitor elé megtanulod a függvényeket és eljárásokat és készítesz hozzájuk saját magad példákat és  nem a Segítségkérésekben kérdezed meg az embereket. Ez csak így megy, személy szerint nekem 4 hónapomba került de nagyban segített, hogy függvények és eljárások 1/3-át én fordítottam le (140 db-ot kb), de van akinek ez 1 év is lehet akár.


Minden esetre a fórum tagjai voltak annyira szorgalmasak és átfordították a vágyakozó szellemû tanulóknak magyarra az összes függvényt és eljárást ezzel is megkönnyítve a dolgotokat. Ezt a wikipédiát
ide kattintva érhetitek el.

Valamint Chuck Norris példái és magyarázatai is nagyon sokat segítenek amelyet
itt tudtok elolvasni, ajánlom olvassátok át többször is akár, mert nagyon hasznos leírás.



Elrendezés

Sokan azt gondolják akik még nem jártasak, hogy egy bizonyos \"séma\" alapján kell írni a PAWNO-ban ahol megvan szabva, hogy egy függvény például csak eljárás után következhet és ilyen dolgok. Elég téveszme, ugyanis szinte bárhogyan írhatjuk a kódunkat csak legelõször az includeot kell feltüntetni és utána már bármit írhatunk. Ez az írás személyfüggõ, mindenkinek van egy stílusa ami a sok gyakorlás után ki szokott alakulni az illetõben, de azért nem mindegy természetesen, hogy rendezetten helyezzük el dolgainkat vagy össze-vissza. Én általában akik ezeket szokták kérdezni tõlem ezt az elrendezési formát tanácsolom:


1.Includeok
2.Definálások
3.Globális változók
4.Stockok
5.Forwardok
6.Enumerátorok
7. Függvények/Eljárások

 

Én mindig így írom meg a kódom és így könnyedén vissza lehet követni bármit és nincs elveszve minden.

Példaként az egyik filterscriptemet írnám le ugyanis példát láthattok defineokra, includeokra, stockokra globális változókra rendes változókra, PVar, logikai operátorok és hasonlók, valamint láthatjátok az elrendezést : parancsok, parancsokhoz tartozó függvények, függvények eljárásai.



#include 
#include
#include
#include
#include
#pragma tabsize 0
#define DIALOG_0 100
#define DIALOG_1 101
#define DIALOG_2 102
#define DIALOG_3 103
#define DIALOG_4 104
#define S_MAX_OBJECTS 5000
#define FILTERSCRIPT
new objectmodelid,
   bool:objectediteles[MAX_PLAYERS],
   bool:objecttorlese[MAX_PLAYERS],
   objectlista = mS_INVALID_LISTID;
stock IsNumeric(const string[])
{
       for (new i = 0, j = strlen(string); i < j; i++) { if (string > \'9\' || string < \'0\') return 0; }
       return 1;
}
stock Objecttolt(filename[])
{
       if(!fexist(filename)) printf(\"Az adott fájl nem létezik, hozd létre ezzel a címmel (objectek - és txt legyen), ha nem hozza létre autómatikusan!\");
               new
       buff[256],
       object,
       WorldID,
               IntID,
               Float: X,Y,Z, rX, rY, rZ,
               szamlalo,
               File:opened = fopen(\"objectek.txt\", io_read);
      if(opened)
               {
                  while(fread(opened, buff))
                  {
                                   unformat(buff,\"dffffffdd\", object, X, Y, Z, rX,rY,rZ,WorldID, IntID);
                                       printf(\"%d, %f, %f, %f, %f, %f, %f, %d, %d\", object, X, Y, Z, rX,rY,rZ, WorldID, IntID );
                                       CreateDynamicObject(object, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, WorldID, IntID, -1, 200.0);
                                   szamlalo++;
                                  }
                                  fclose(opened);
       }
               return 1;
}
stock Objectment(filename[],object,Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ, WorldID, IntID)
{
  new File:opened,
  sorok[256];
  format(sorok,sizeof(sorok), \"%d %f %f %f %f %f %f %d %d \\r\\n\", object, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, WorldID,IntID);
  opened = fopen(filename, io_append);
  fwrite(opened, sorok);
  fclose(opened);
  return 1;
}
public OnFilterScriptInit()
{
       print(\"\\n--------------------------------------\");
       print(\"Online Munka Készító FilterScript - by SnooP\");
   print(\"      Sikeresen betöltve\\n\"              );
   print(\"     Minden eleme betöltve\\n\"           );
       print(\"--------------------------------------\\n\");
   Objecttolt(\"objectek.txt\");
   objectlista = LoadModelSelectionMenu(\"objmenu.txt\");
       return 1;
}
CMD:parancsok(playerid,params[])
{
  if(IsPlayerAdmin(playerid))
  {
  ShowPlayerDialog(playerid,DIALOG_0,DIALOG_STYLE_MSGBOX,\"Az összes parancs\",\"{3ba326}/ol {f70d0d}(Objectek létrehozása), {3ba326}/ot {f70d0d}(Objectek Törlése)\\n {3ba326}/oe {f70d0d}(Objectek editelése), {3ba326}/om {f70d0d}(Objectek másolása)\\n {3ba326}/ols {f70d0d}(Az összes object listája)\",\"Kilépek\",\"\");
  }
 return 1;
}
CMD:ol(playerid,params[])
{
if(IsPlayerAdmin(playerid))
ShowPlayerDialog(playerid,DIALOG_1,DIALOG_STYLE_INPUT,\"Object ID\",\"Kérlek írd be az általad válaszott Object ID-jét!\",\"Tovább\",\"Mégse\");
return 1;
}
CMD:om(playerid,params[])
{
if(IsPlayerAdmin(playerid))
objectediteles[playerid] = false;
objecttorlese[playerid] = false;
ShowPlayerDialog(playerid,DIALOG_2,DIALOG_STYLE_MSGBOX,\"Használat\",\"Az object másolása igen egyszerû, kilépés után ki kellesz válaszd melyik objectet akarod másolni, majd beállítod, mint az object editelésénél a helyét\",\"OK\",\"\");
return 1;
}
CMD:oe(playerid,params[])
{
if(IsPlayerAdmin(playerid))
objectediteles[playerid] = true;
objecttorlese[playerid] = false;
ShowPlayerDialog(playerid,DIALOG_3,DIALOG_STYLE_MSGBOX,\"Használat\",\"Az objectek editelése egyszerû feladat. Elõször válaszd ki az objectet amelyiket editelni akarod, majd a grafikus felületen szabd kedvedre!\",\"OK\",\"\");
return 1;
}
CMD:ot(playerid,params[])
{
if(IsPlayerAdmin(playerid))
objecttorlese[playerid] = true;
objectediteles[playerid] = false;
ShowPlayerDialog(playerid,DIALOG_4,DIALOG_STYLE_MSGBOX,\"Használat\",\"Az object törlése igen egyszerû, csupán kattints arra az objectre amelyiket törölni szeretnéd.\",\"OK\",\"\");
return 1;
}
CMD:ols(playerid,params[])
{
if(IsPlayerAdmin(playerid))
ShowModelSelectionMenu(playerid, objectlista, \"Objectek\");
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_0)
       {
           if(!response) SendClientMessage(playerid,-1, \"{f70d0d}Kiléptél a dialogból!\");
       }
if(dialogid == DIALOG_1)
  {
   if(response)
    {
     if(IsNumeric(inputtext))
      {
       new Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ,
       stringg[60],
               IntID,
               WorldID;
       objectmodelid = strval(inputtext);
               format(stringg, sizeof(stringg), \"Sikeresen létrehoztad a %d Objectet\", objectmodelid);
       SendClientMessage(playerid, -1, stringg);
       GetPlayerPos(playerid,X,Y,Z);
               IntID = GetPlayerInterior(playerid);
               WorldID = GetPlayerVirtualWorld(playerid);
               GetDynamicObjectRot(objectmodelid, Float:rX, Float:rY, Float:rZ);
               CreateDynamicObject(objectmodelid,Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ,WorldID,IntID, -1, 200.0);
               GetPVarInt(playerid, \"objectmodelid\");
               SetPVarInt(playerid, \"omodelid\", objectmodelid);
      }
         else
         SendClientMessage(playerid,-1,\"Te egy betüt írtál be. Kérlek írj egy létezõ Objectnek az ID-jét\");
         ShowPlayerDialog(playerid,DIALOG_1,DIALOG_STYLE_INPUT,\"Object ID\",\"Kérlek írd be az általad válaszott Object ID-jét!\",\"Tovább\",\"Mégse\");
        }
   else
   SendClientMessage(playerid,-1,\"Kiléptél az Object Létrehozásából!\");
  }
if(dialogid == DIALOG_2)
       {
                       if(response) SendClientMessage(playerid, -1, \"Kattints egy objectre annak másolásához\");
           SelectObject(playerid);
                       return 1;
       }
if(dialogid == DIALOG_3)
       {
           if(response) SendClientMessage(playerid, -1, \"Kattints egy objectre annak editeléséhez!\");
                       SelectObject(playerid);
                       return 1;
               }
if(dialogid == DIALOG_4)
       {
           if(response) SendClientMessage(playerid, -1, \"Kattints a törölni való objectre!\");
                       SelectObject(playerid);
                       return 1;
               }
return 1;
}
public OnPlayerSelectDynamicObject(playerid, objectid, modelid, Float:x, Float:y, Float:z)
{
if(objectediteles[playerid] == false && objecttorlese[playerid] == false)
{
new Float: rx, Float: ry, Float:rz, WorldID, IntID, objid;
GetPlayerPos(playerid,x,y,z);
IntID = GetPlayerInterior(playerid);
WorldID = GetPlayerVirtualWorld(playerid);
objid = CreateDynamicObject( modelid, Float:x,Float:y,Float:z,Float:rx,Float:ry,Float:rz,WorldID,IntID, -1, 200.0);
SendClientMessage(playerid, -1, \" Sikeresen kiválasztottad az objectet, mostmár másolhatod\");
EditDynamicObject(playerid, objid);
}
if(objectediteles[playerid] == true )
{
SendClientMessage(playerid, -1, \" Sikeresen kiválasztottad az objectet, mostmár editelheted\");
EditDynamicObject(playerid,objectid);
}
if(objecttorlese[playerid] == true)
{
new File:opened = fopen(\"objectek.txt\", io_append),
sorok[128];
DestroyDynamicObject(objectid);
SendClientMessage(playerid, -1, \" Az object törölve a játékban és a fájlban is egyaránt (A fájlban a törölt object adatai helyett egy \'Törölt Object\' címszó lesz\");
 if(opened)
 {
  {
    fread(opened, sorok);
    {
      new Float: rX, Float:rY, Float:rZ;
          new  InteriorID, WorldID;
          GetDynamicObjectRot(objectid, Float:rX, Float:rY, Float: rZ);
          InteriorID = GetPlayerInterior(playerid);
          WorldID = GetPlayerVirtualWorld(playerid);
          if(sscanf(sorok, \"dffffffdd\" , modelid, Float:x, Float:y, Float:z, Float:rX, Float:rY, Float:rZ, WorldID, InteriorID))
      {
       fwrite(opened, \"Törölt Object\\r\\n\");
          }
        }
  }
 }
 fclose(opened);
}
return 1;
}
public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
       new Float:oldX, Float:oldY, Float:oldZ,
   Float:oldRotX, Float:oldRotY, Float:oldRotZ,
   Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ,
       Float:speed = 10.0,
       IntID,
   WorldID;
   GetDynamicObjectPos(objectid, Float:oldX, Float:oldY, Float:oldZ);
   GetDynamicObjectRot(objectid, Float:oldRotX, Float:oldRotY, Float:oldRotZ);
   if(response == EDIT_RESPONSE_CANCEL)
   {
                       SetDynamicObjectPos(objectid, Float:oldX, Float:oldY, Float:oldZ);
                       SetDynamicObjectRot(objectid, Float:oldRotX, Float:oldRotY, Float:oldRotZ);
       }
       if(response == EDIT_RESPONSE_UPDATE)
   {
   MoveDynamicObject( objectid, Float:x, Float:y, Float:z, Float:speed, Float:rX = -1000.0, Float:rY = -1000.0, Float:rZ = -1000.0 );
       }
   if(response == EDIT_RESPONSE_FINAL)
       {
       SendClientMessage(playerid, -1, \"Sikeresen mentetted az objectet\");
       GetDynamicObjectPos(objectid, Float:X, Float:Y, Float:Z);
       IntID = GetPlayerInterior(playerid);
       WorldID = GetPlayerVirtualWorld(playerid);
       GetDynamicObjectRot(objectid, Float:rX, Float:rY, Float:rZ);
       Objectment(\"objectek.txt\",GetPVarInt(playerid,\"omodelid\"),Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ,WorldID,IntID);
       }
  return 1;
}
public OnPlayerModelSelection(playerid, response, listid, modelid)
{
   if(listid == objectlista)
   {
       if(response)
       {
           SendClientMessage(playerid, -1, \"Object lerakva\");
           new Float:X, Float: Y, Float:Z;
                       GetPlayerPos(playerid, Float:X, Float:Y, Float:Z);
           CreateDynamicObject(modelid, Float:X, Float:Y, Float:Z, 0.0, 0.0, 0.0, 0, 0);
               SetPVarInt(playerid, \"omodelid\", modelid);
       }
       else SendClientMessage(playerid, -1, \"Kiléptél az objectek listájából\");
       return 1;
   }
return 1;
}
public OnFilterScriptExit()
{
   print(\"\\n--------------------------------------\");
       print(\"Online Munka Készító FilterScript - by SnooP\");
   print(\"             Leállt\\n\"                   );
   print(\"        Minden eleme mentve\\n\"           );
       print(\"--------------------------------------\\n\");
       return 1;
}

 

Tehát még egyszer is hangsúlyoznám, az elrendezés ki fog alakulni idõvel mindenkibe, csak arra figyeljetek oda, hogy rendezett legyen és szépen felépített, higgyétek el sokat számít ;)

Utószó

Remélem megértette a célközönség és hasznos volt számukra. Ha kérdésetek lenne akkor nyugodtan tegyétek fel komment formájában, esetlegesen ha hibákat véltek felfedezni kérlek szóljatok. Köszönöm annak akinek volt türelme és végigolvasta.



Üdv

SnooP

Nem elérhető Live

  • 507
    • Profil megtekintése
Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Válasz #1 Dátum: 2013. November 09. - 21:29:35 »
0
Szép leírás :)

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Válasz #2 Dátum: 2013. November 09. - 22:09:18 »
0
Köszönöm, igyekeztem :)

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Válasz #3 Dátum: 2013. November 10. - 05:06:55 »
0

Köszönöm, igyekeztem :)
 
[/quote]
Tökéletes leírás, kiemelést érdemelne. Ilyen leírás az igazi, szép munka!

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Válasz #4 Dátum: 2013. November 11. - 19:58:41 »
0
Kösz, de moderátor létemre nem emelem ki ne legyen az, hogy csak azért kiemelt a témám, mert rangom van :D

Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Válasz #5 Dátum: 2013. December 12. - 19:36:03 »
0
Király leírás köszi!
Három kérdésem lenne még...
 
  • Az enum akkor kicsit olyan mintha PHP-ban egy objektumnak adnék egy újabb attribútumot? (Tömb bõvítés és értékadás a bõvítménynek )
  • Az include megoldás hasonló a autoloadinghoz?

Tehát, hogy alapvetõen nem tölteti be a memóriába a libet csupán csak akkor ha szükség van rá? Máshol olvastam így és miután a pawno és a samp mechanizmusát nem ismerem mielõtt erre a dologra építenék egy potenciálisan srv killer kódot azért megkérdezem :)
  • Ez a kérdés kicsit keszekusza. Van egy \'A\' és egy \'B\' include-om a játék módban. Az \'A\' include-ban definiáltam változókat, állandókat, eljárásokat és függvényeket. A \'B\' include-ban tudom ezeket alkalmazni anélkül, hogy módba elõzõleg már include-olt \'A\' libet külön include-olnom kéne a \'B\' libbe, vagy ezt sajnos nem tudja a pawn?

 

És egy észrevétel... Lehet, hogy én futottam át felszínesen a leírást, de a bemutatott scriptben láttam egy olyat, hogy \"Pragma\"...
Az mit tud?
Üdvözlehelletem.

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok és milyen elrendezés alapján írhatunk PAWNO-ban.
« Válasz #6 Dátum: 2013. December 12. - 20:36:07 »
0
Szervusz, elõször is örülök, hogy feltetted a kérdéseidet mert az ember csak így tanulhat.
Az elsõ kérdésedre: ugye sampban a tömbök így néznek ki
new tomb[128]

 na ez így egy tömb (persze még vannak 3 dimenziós tömbök és hasonlók de 90%-ban ezt használjuk). Ha SA:MP-ban tömböt bõvítenél (tömb bõvítésekor SA:MP-ban csak úgy lehet ha hozzáadsz egy másik tömböt):
new tomb[24], tombe[32];
       new vegeredmeny = tomb[12]+tombe[24];
       printf(\"Vegeredmeny: %d\", vegeredmeny);

 
Az enummal ezt a tömböt nem tudod bõvíteni, az enum az egy \"adatbázis\", megadsz különbözõ fogalmakat és azoknak értéket amelyek a függvények lefutásakor tárolódnak míg a változóknál a függvények lefutásakor az érték lenullázódik (kivéve a konstans és statikus változóknál). Ajánlom figyelmedbe a leírást az enum használatával onnan megérted, hogy mire való és hogyan kell használni :) Valamint http://forum.sa-mp.com/showthread.php?t=318212 ez a leírás nagyon jól elmagyarázza a tömbök kezelését és hasonló dolgokat.


Második:
Ez include függõ mivel sok van, sok programozótól és nem mindenki így írta meg (régebbi includeoknál a nyakamat teszem rá, hogy van pár olyan amelyik betölti az egészet szükségtelenül). Az alap a_samp-nál úgy tudom, hogy csak akkor tölti be, amikor meghívódik az adott eljárás/függvény.


Harmadik
Amit te mondasz nem includeokkal csinálják hanem filterscriptekkel (olvasd el ChuckNorrist leírását ezekkel kapcsolatban mivel egymásra épülnek a dolgok). És igen sajnos úgy van, hogy ha betöltöd A filterscriptet és B filterscriptet egyszerre, akkor az A filterscriptnél használt dolgokat hiába használod B filterscriptnél hibásan fogja jelezni mivel az a kettõ két különálló dolog, amely nem egymásban fut le, hanem egymással párhuzamosan futnak a szerver elindításakor ;)


Negyedik:
Igen valóban a példascriptben használtam a pragma-t, de direkt nem emeletem ki, hogy az emberek ne legyenek lusták, mint én.
Ez a pragma a kényelmes (csúnyábban lusta) embereknek lett kitalálva. A lényege annyi, hogy azokat a sorokat amelyeket úgy érzékeli a PAWNO hogy hibás, soreltolódás miatt ezzel a kód segítségével lehet korrigálni. Amikor újra lecompielozzuk eltûnnek a hibák mindenféle javítás nélkül.
Remélem választ kaptál a kérdéseidre ;)

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal