hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.03.28. 17:05



Jelenlévő felhasználók

Jelenleg 227 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 226 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: Google [Bot] az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 14 hozzászólás ]  Oldal 1 2 Következő
Szerző Üzenet
 Hozzászólás témája: [Tut] For ciklusos menü
HozzászólásElküldve: 2016.04.21. 21:54 
Offline
Nagyúr
Avatar

Csatlakozott: 2014.08.24. 18:28
Hozzászólások: 584
Megköszönt másnak: 122 alkalommal
Megköszönték neki: 120 alkalommal
Sziasztok!

Mivel rengeteg if-es menüt látok, gondoltam megosztom veletek ezt a szerintem elég praktikus dolgot.
Remélem elég közérthetőre sikerült a leírás. Elsősorban a CS:GO fanoknak ajánlom raktár, és egyéb menükhöz.

Amire szükség van egy for ciklusos menühöz:
1. Menü
2. Egy Const a menü elemekkel
3. For ciklus

A consthoz kis előismeretként itt egy apró leírás az enumokról:
LyleChriss @ Enum az enumban [MEGOLDVA]

Akkor kezdjünk is bele.
Itt a const-om, amit a tutorial során használni fogok:
  1. enum _:Skin
  2. {
  3.     Name[32],
  4.     Model[32]
  5. }
  6.  
  7. new const SKINS[][Skin] = {
  8.     //Név, modell
  9.     {"Arany AK", "models/arany_ak.mdl"},
  10.     {"Arany M4", "models/arany_m4.mdl"},
  11.     {"Arany MP5", "models/arany_mp5.mdl"},
  12.     {"Arany Deagle", "models/arany_deagle.mdl"},
  13.     {"Arany AWP", "models/arany_awp.mdl"}
  14. }


Tételezzük fel, hogy a menü parancsát már tök ügyesen regisztráltuk a plugin_init-ben. :D
Ez esetben legyen a funkciója a "menu".

  1. public menu(id)
  2. {
  3.     new txt[128]
  4.    
  5.     new menu = menu_create("Példa menü", "menu_h")
  6.  
  7.     //elindítjuk a for ciklust
  8.     for(new i; i<sizeof(SKINS) ; i++)
  9.     {
  10.         //minden skin nevet egyessével a "txt" tömbbe másolunk
  11.         formatex(txt, charsmax(txt), "%s", SKINS[i][Name])
  12.         //majd a additemmel új menüelemként hozzáadjuk a menühöz
  13.         menu_additem(menu, txt, "", 0)
  14.     }
  15.    
  16.     menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
  17.     menu_setprop(menu, MPROP_BACKNAME, "Vissza");
  18.     menu_setprop(menu, MPROP_NEXTNAME, "Következő");
  19.     menu_setprop(menu, MPROP_EXITNAME, "Kilépés");
  20.        
  21.     menu_display(id, menu, 0)
  22.    
  23. }
  24.  
  25. public menu_h(id, menu, item)
  26. {
  27.     if(item == MENU_EXIT) {
  28.         menu_destroy(menu);
  29.         return PLUGIN_HANDLED;
  30.     }
  31.    
  32.     //az item egyenlő a fenti for ciklusban szereplő i-vel
  33.     //Azaz az első menü elemnél az item=0; másodiknál item=1; stb...
  34.     client_print(id, print_chat, "Kiválasztottad a %s skint!", SKINS[item][Name])
  35.    
  36.     menu_destroy(menu);
  37.     return PLUGIN_HANDLED;
  38. }


Ez volt hát egy alap for ciklusos menü.
Most csavarjunk egyet a dolgokon: Csak akkor jelenítsünk meg egy skint, ha az illető legalább egyet birtokol belőle, valamint egy változóban tárolni fogjuk a kiválasztott skint is.

  1. enum _:Skin
  2. {
  3.     Type[8], //Jobb megoldást nem tudok, jelzem egy számmal (vagy stringgel) a fegyver típusát megkülönböztetéshez
  4.     Name[32],
  5.     Model[32]
  6. }
  7.  
  8. new const SKINS[][Skin] = {
  9.     //Típus, Név, Modell
  10.     {0, "Arany AK", "models/arany_ak.mdl"},
  11.     {1, "Arany M4", "models/arany_m4.mdl"},
  12.     {2, "Arany MP5", "models/arany_mp5.mdl"},
  13.     {3, "Arany Deagle", "models/arany_deagle.mdl"},
  14.     {4, "Arany AWP", "models/arany_awp.mdl"}
  15. }
  16.  
  17. enum _:WPNS
  18. {
  19.     AK47,
  20.     M4A1,
  21.     MP5,
  22.     DEAGLE,
  23.     AWP
  24. }
  25.  
  26. new const meglevo[33][sizeof(SKINS)]
  27. new const kivalasztott[33][WPNS]


Ezzel meg is vannak a szükséges előfeltételek.
A menü a következőképp kell kinézzen:

  1. public menu(id)
  2. {
  3.     new txt[128], num[8]
  4.    
  5.     new menu = menu_create("Példa menü", "menu_h")
  6.  
  7.     //elindítjuk a for ciklust
  8.     for(new i; i<sizeof(SKINS) ; i++)
  9.     {
  10.             //leellenőrízzük, birtokol-e legalább egyet belőle
  11.             if(meglevo[id][i] >= 1)
  12.             {
  13.                 //Az i értékét átvisszük menüinfóban, hogy el tudjuk dönteni, melyik skint választottuk.
  14.                 num_to_str(i, num, 8)
  15.                 formatex(txt, charsmax(txt), "%s", SKINS[i][Name])
  16.                 menu_additem(menu, txt, num, 0)
  17.             }
  18.     }
  19.    
  20.     menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
  21.     menu_setprop(menu, MPROP_BACKNAME, "Vissza");
  22.     menu_setprop(menu, MPROP_NEXTNAME, "Következő");
  23.     menu_setprop(menu, MPROP_EXITNAME, "Kilépés");
  24.        
  25.     menu_display(id, menu, 0)
  26.    
  27. }
  28.  
  29. public menu_h(id, menu, item)
  30. {
  31.     if(item == MENU_EXIT) {
  32.         menu_destroy(menu);
  33.         return PLUGIN_HANDLED;
  34.     }
  35.     new data[9], access, callback, szName[64]
  36.     menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
  37.     new key = str_to_num(data)
  38.    
  39.     //Eldöltjük a fegyver típusát
  40.     switch(SKINS[key][Type])
  41.     {
  42.         //a megfelelő típusra kiválasztjuk a skint
  43.         case 0: kivalasztott[id][AK47] = key
  44.         case 1: kivalasztott[id][M4A1] = key
  45.         case 2: kivalasztott[id][MP5] = key
  46.         case 3: kivalasztott[id][DEAGLE] = key
  47.         case 4: kivalasztott[id][AWP] = key
  48.     }
  49.    
  50.     client_print(id, print_chat, "Kiválasztottad a %s skint!", SKINS[key][Name])
  51.    
  52.     menu_destroy(menu);
  53.     return PLUGIN_HANDLED;
  54. }


Nos hát, ennyi lett volna a tutorial, remélem kielégíti az igényeket. :)
Tudom, a végére már kezdett átcsapni CS:GO mód raktár tutorialba, dehát én is ott használtam legtöbbször, és úgyis hatalmas trend most Dero módja. :lol:
Persze ez nem azt jelenti, hogy máshol nem alkalmazható. :nono:


A hozzászólást 8 alkalommal szerkesztették, utoljára LyleChriss 2016.05.05. 19:47-kor.

Ők köszönték meg LyleChriss nek ezt a hozzászólást (összesen 4): kengurumancs (2016.04.22. 19:09) • The Peace (2016.05.05. 19:41) • Toretto (2016.09.19. 19:00) • jokypapa (2018.01.09. 09:48)
  Népszerűség: 9.09%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:01 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
Ha #define MAXSKINS 5
akkor nem kéred le sizeof(SKINS) ugye? :D

Ha meg nem definiálod, mert amúgy felesleges, akkor
new size = sizeof(SKINS);

és a size-ot írod a for ciklusba, hogy ne kérje le 60x a méretet.

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:02 
Offline
Nagyúr
Avatar

Csatlakozott: 2014.08.24. 18:28
Hozzászólások: 584
Megköszönt másnak: 122 alkalommal
Megköszönték neki: 120 alkalommal
mforce írta:
Ha #define MAXSKINS 5
akkor nem kéred le sizeof(SKINS) ugye? :D

Ha meg nem definiálod, mert amúgy felesleges, akkor
new size = sizeof(SKINS);

és a size-ot írod a for ciklusba, hogy ne kérje le 60x a méretet.

Jogos, javítom :D Kicsit késő van már. :oops:


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:04 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
menü javítás:

  1. public menu(id)
  2. {
  3.     new txt[128];
  4.    
  5.     new menu = menu_create("Példa menü", "menu_h")
  6.    
  7.     //elindítjuk a for ciklust
  8.     new size = sizeof(SKINS);
  9.     for(new i; i<size; i++)
  10.     {
  11.             //leellenőrízzük, birtokol-e legalább egyet belőle
  12.             if(meglevo[id][i] >= 1)
  13.             {
  14.                 menu_additem(menu, SKINS[i][Name], "", 0)
  15.             }
  16.     }
  17.    
  18.     menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
  19.     menu_setprop(menu, MPROP_BACKNAME, "Vissza");
  20.     menu_setprop(menu, MPROP_NEXTNAME, "Következő");
  21.     menu_setprop(menu, MPROP_EXITNAME, "Kilépés");
  22.        
  23.     menu_display(id, menu, 0)
  24.    
  25. }
  26.  
  27. public menu_h(id, menu, item)
  28. {
  29.     if(item == MENU_EXIT) {
  30.         menu_destroy(menu);
  31.         return PLUGIN_HANDLED;
  32.     }
  33.    
  34.     //Eldöltjük a fegyver típusát
  35.     switch(SKINS[item][Type])
  36.     {
  37.         //a megfelelő típusra kiválasztjuk a skint
  38.         case 0: kivalasztott[id][AK47] = item
  39.         case 1: kivalasztott[id][M4A1] = item
  40.         case 2: kivalasztott[id][MP5] = item
  41.         case 3: kivalasztott[id][DEAGLE] = item
  42.         case 4: kivalasztott[id][AWP] = item
  43.     }
  44.    
  45.     client_print(id, print_chat, "Kiválasztottad a %s skint!", SKINS[item][Name])
  46.    
  47.     menu_destroy(menu);
  48.     return PLUGIN_HANDLED;
  49. }

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:06 
Offline
Nagyúr
Avatar

Csatlakozott: 2014.08.24. 18:28
Hozzászólások: 584
Megköszönt másnak: 122 alkalommal
Megköszönték neki: 120 alkalommal
mforce írta:
menü javítás

Direkt formatex-eztem, gondoltam GYK, ha valaki később darabszámot akar kiírni, nem kell annyit törnie a pici buksiját. Sóval azt nem javítom benne, hadd maradjon csak a HSZ-edben. :D


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:08 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
Nem csak azért... a getinfo felesleges, a num felesleges.

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:10 
Offline
Nagyúr
Avatar

Csatlakozott: 2014.08.24. 18:28
Hozzászólások: 584
Megköszönt másnak: 122 alkalommal
Megköszönték neki: 120 alkalommal
mforce írta:
Nem csak azért... a getinfo felesleges, a num felesleges.

Azt javítottam, de elmagyarázhatnád, miért. Hiszen az item azt jelöli, hanyadik menüelemet választottam, de ha az 5. skinből van csak neki, az a 0. (első) menüelem lesz, nemde? Akkor pedig a handlerben a const 0. sorának adatait olvassuk ki.


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: For ciklusos menü
HozzászólásElküldve: 2016.04.21. 22:15 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
Jogos, az ifre nem figyeltem fel

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: [Tut] For ciklusos menü
HozzászólásElküldve: 2016.04.22. 06:11 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
A sizeof értékét fölösleges külön változóba menteni, pre-compiler behelyettesíti, nem run-time művelet. ( -l fordító paraméterrel tudod csak a pre-compilert futtatni és mevnézni ;) )
+ Mindig új menüt hozol létre az itemjeivel -> simán a handler 3. paraméteréből nem lesz meg, h az melyik. Vagy item infos dolog vagy a menü nevét ellenőrizgeted, de előbbi gazdaságos.

_________________
Néha itt, de többször nem.

Ők köszönték meg Akosch:. nek ezt a hozzászólást (összesen 2): LyleChriss (2016.04.22. 06:32) • Maxi (2016.12.31. 00:57)
  Népszerűség: 4.55%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: [Tut] For ciklusos menü
HozzászólásElküldve: 2016.12.31. 00:10 
Offline
Félisten
Avatar

Csatlakozott: 2016.03.06. 14:20
Hozzászólások: 964
Megköszönt másnak: 102 alkalommal
Megköszönték neki: 134 alkalommal
A case-t nem lehet rövidebben lefuttatni a "bonyolultabb" menünél?

_________________
 ! Moderátori megjegyzés (kiki):
Kérlek csekkold az aláírásra vonatkozó szabályokat!


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 14 hozzászólás ]  Oldal 1 2 Következő


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 0 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole