Szerző Téma: [Scripting Eszköz]foreach [Ciklus helyettesítõ]  (Megtekintve 6711 alkalommal)

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Dátum: 2011. Május 13. - 23:14:30 »
0
Foreach
 
Bevezetõ
A foreach lecseréli a ciklusokat( leginkább a játékosokra vonatkozókat ) gyorsabb, és még hatékonyabb ciklusokra. Példa:
 

for( new i = 0; i != MAX_PLAYERS; ++i ) {
    if (IsPlayerConnected( i ) ) {
        printf( \"Játékos %d csatlakozva van\", i );
    }
}

 
Egyszerûen ezzé válik:
 

foreach(Player, i) {
    printf( \"Játékos[%d] csatlakozva van\", i );   
}

 
Felhívnám a figyelmet, hogy ez nem csak egy egyszerû definíció, ami az eredeti ciklust illeszti be más néven, hanem ez tulajdonképpen egy teljesen különbözõ beágyazás, ami játékoslistázást használ, emiatt gyorsabb az eredeti rendszernél. Sõt, a mûködési elve miatt nem számít a MAX_PLAYERS értéke, akár be van állítva a te szerveredhez, akár nincs; Ez a ciklusfajta mindig ugyanannyi idõ alatt fog lefutni, mivel ez CSAK a csatlakozott játékosokat kezeli, üres azonosítókat nem.
Beágyazás
Ez a függvénykönyvtár ezt a rendszert használja, tehát mindössze ennyit kell csinálj:
 

#include <foreach>

 
Ezek után már használhatod az új ciklust.
Ha filterszkriptben szeretnéd használni ezt a rendszert, akkor tedd a következõt:
 

#define FILTERSCRIPT
#include <foreach>

 
Ha a forrásodban már szerepel a FILTERSCRIPT definíció, akkor gyõzõdj meg róla, hogy a foreach beágyazása FÖLÖTT legyen.
Deklaráció
Hogy létrehozz egy iterátort( egy elem, amit a foreach segítségével használhatsz ), használd a következõ kódot:
 
new Iterator:MyIterator<10>;

 
Ez létre fogja hozni a \"MyIterator\" nevû iterátort, amihez 10 férõhelyet rendel.
Figyelmedbe ajánlom, hogy ez a szintaxis ezen a kódon alapul, és formára hasonlít egy átlagos változó deklarálására( többrétû elemek használata ), de ez nem egy tömb, így az emberek nem esnek abba a hibába, hogy direkt módon próbálnak meg információkhoz hozzáférni, tehát a szerkezet fontos.
Használata
A saját iterátorodat a következõ képpen használhatod:
 

foreach(MyIterator, var) {
    printf( \"Változó[%d] aktív\", var );
}

 
Értékek hozzáadása:
 
Iter_Add( MyIterator, 7 );

 
Értékek törlése:
 
Iter_Remove( MyIterator, 7 );

 
Ha egy véletlenszerû értéket szeretnél lekérdezni az iterátorodból GYORSAN( ez nagyon jó véletlenszerû játékosok kiválasztására ), csináld ezt:
 
Iter_Random( MyIterator );

 
Játékoshoz:
 
new randomplayer = Iter_Random( Player );

 
Függvények
 

  • Iterator:név<méret>
    Létrehoz egy új iterátort a megadott névvel és mérettel. A rendszer automatikusan definiálja a következõ iterátorokat:
    • Player - Minden csatlakozott játékos

    • Bot (0.3) - Minden csatlakozott bot

    • NPC (0.3) - Minden csatlakozott bot( ugyan az, mint a Bot )

    • Character (0.3) - Minden csatlakozott játékos és bot


    • Iter_Add(name,value)

    Értéket rendel hozzá a megadott iterátorhoz. A fentieket automatikusan kezeli.
    • Iter_Remove(name,value)

    Értéket töröl a megadott iterátorból. A fentieket automatikusan kezeli.
    • Iter_Clear(name)

    Teljesen kiürít egy iterátort. Minden értéket töröl.
    • Iter_Random(name)

    Visszatér egy véletlenszerû értékkel a megadott iterátorból. Hasznos véletlenszerû játékosok kiválasztásához( ez sokkal gyorsabb, mint a többi ehhez hasonló módszer, a kód struktúrája miatt ).
    • Iter_Count(name)

    Visszatér egy megadott iterátor elemeinek számával( például hány csatlakozott játékos van a szerveren ) - NAGYON gyorsan
    • IteratorArray:name[num]<size>

    Létrehoz egy új multidimenziós iterátort a megadott névvel, és a maximális tárolási mérettel.
    • Iter_Init(name)

    Ha létrehoztál egy multidimenziós iterátort, akkor ezt a függvényt meg KELL hívnod, mielõtt bármit is raknál bele.
    • Iter_Func2(name,index,pars)

    Felhívom a figyelmet, hogy ezek a függvények el lettek távolítva a legújabb verzióban - most már csak szimplán meg kell indexelned a tömböt.
    Ha a \"2\" szerepel a fenti függvények végén, és az iterátorod végén( de a paraméterek ELÕTT ) egy index áll, akkor multidimenziós iterátort kapsz. Például:
     


new IteratorArray:My2d[3]<5>;
Iter_Init2(My2d);
Iter_Add2(My2d, 1, 4);

 
Ezzel létrehozol 3 5-elemes iterátort, és a másodikhoz hozzáadod a 4-et értékként.
Fordítási beállítások
A beágyazás elõtt definiálhatsz pár dolgot, hogy testreszabd a foreach funkcióit.
 
  • FOREACH_NO_BOTS
    Ha csak játékosokra akarod vonatkoztatni a ciklusaidat, akkor használd ezt a definíciót, hogy megszüntesd a kódot, ami a botokat(NPC) nézi.

  • FOREACH_NO_PLAYERS
    Ezzel megszünteted a játékosok ÉS botok számlálását, így csak a fõ funkciók lesznek elérhetõk.


Többrétû dimenziók
Az elõzõ kiadás minden függvényének volt egy \"Iter_Func2\" változata - ezek most törölve lettek egy még egyértelmûbb szintaxis létrehozásának érdekében:
Mostantól létrehozhatsz többrétû iterátorokat is. Például egy iterátorokból álló tömböt, ami a játékosok jármûit tartalmazza( habár volna jobb javaslatom is ennek megoldására ):
 

foreach(PlayerVehicles[ playerid ], veh) {
    //Itt csinálhatsz valamit az adott játékos jármûvével
}

 
Multidimenziós iterátorok létrehozásához meg kell hívnod ezt a függvényt:
 
Iter_Init( iterator );

 
Az iterátor használata elõtt. Az egyszerû iterátorokat inicializálhatod a fordítási idõ közben, de a multidimenziósokat nem.
Példák
Elsõ példa
Multidimenziós iterátorok. Ezzel egy iterátorokból álló tömböt hozhatsz létre:
 

#include <foreach>
new IteratorArray:Vehicle[4]<20>;
public OnGameModeInit()
{
    //Elõször EZT KELL meghívnod multidimenziós iterátoroknál.
    Iter_Init(Vehicle);
    //Hozzáadás az ELSÕ listához
    Iter_Add(Vehicle[0], AddStaticVehicle(454, -1364.0269, 1470.2139, 0.3568, 165.0191, -1, -1));
    Iter_Add(Vehicle[0], AddStaticVehicle(484, -1394.0040, 1468.3309, 0.1742, 99.7403, -1, -1));
    Iter_Add(Vehicle[0], AddStaticVehicle(484, -1404.9385, 1507.1971, -0.0963, 60.9265, -1, -1));
    Iter_Add(Vehicle[0], AddStaticVehicle(446, -1603.1550, 1391.8168, -0.8820, 310.2346, -1, -1));
    //Hozzáadás a MÁSODIK listához
    Iter_Add(Vehicle[1], AddStaticVehicle(446, -1698.8333, 1411.8612, -0.4988, 333.6676, -1, -1));
    Iter_Add(Vehicle[1], AddStaticVehicle(446, -1710.4403, 1430.0688, -0.5722, 322.3057, -1, -1));
    Iter_Add(Vehicle[1], AddStaticVehicle(473, -1623.9312, 1438.3147, -0.2109, 280.8999, -1, -1));
    //Hozzáadás a HARMADIK listához
    Iter_Add(Vehicle[2], AddStaticVehicle(473, -1609.0120, 1405.0123, -0.1395, 300.4936, -1, -1));
    Iter_Add(Vehicle[2], AddStaticVehicle(487, -1651.4410, 1302.6608, 7.2126, 310.4509, -1, -1));
    //Hozzáadás a NEGYEDIK listához
    Iter_Add(Vehicle[3], AddStaticVehicle(487, -1736.8011, 1400.1903, 7.3641, 293.3916, -1, -1));
    //Végigmegyünk a második lista összes jármûvén
    foreach (Vehicle[1], veh)
    {
        ChangeVehicleColor(veh, 0, 10);
    }
    //Végigmegyünk az elsõ lista összes jármûvén
    foreach (Vehicle[0], veh)
    {
        ChangeVehicleColor(veh, 12, 20);
    }
}

 
Második példa
Multidimenziós iterátorok. Létrehozunk egy iterátorokból álló tömböt, és a jármûveket egy összetett listához hozzáadjuk.
 

#include <foreach>
new IteratorArray:Vehicle[4]<20>;
public OnGameModeInit()
{
    //Elõször EZT KELL meghívnod multidimenziós iterátoroknál.
    Iter_Init(Vehicle);
    new
        veh;
    veh = AddStaticVehicle(454, -1364.0269, 1470.2139, 0.3568, 165.0191, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[2], veh);
    veh = AddStaticVehicle(484, -1394.0040, 1468.3309, 0.1742, 99.7403, -1, -1);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[2], veh);
    Iter_Add(Vehicle[3], veh);
    veh = AddStaticVehicle(484, -1404.9385, 1507.1971, -0.0963, 60.9265, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[2], veh);
    Iter_Add(Vehicle[3], veh);
    veh = AddStaticVehicle(446, -1603.1550, 1391.8168, -0.8820, 310.2346, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[3], veh);
    veh = AddStaticVehicle(446, -1698.8333, 1411.8612, -0.4988, 333.6676, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[2], veh);
    veh = AddStaticVehicle(446, -1710.4403, 1430.0688, -0.5722, 322.3057, -1, -1);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[2], veh);
    Iter_Add(Vehicle[3], veh);
    veh = AddStaticVehicle(473, -1623.9312, 1438.3147, -0.2109, 280.8999, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[2], veh);
    Iter_Add(Vehicle[3], veh);
    veh = AddStaticVehicle(473, -1609.0120, 1405.0123, -0.1395, 300.4936, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[3], veh);
    veh = AddStaticVehicle(487, -1651.4410, 1302.6608, 7.2126, 310.4509, -1, -1);
    Iter_Add(Vehicle[0], veh);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[2], veh);
    veh = AddStaticVehicle(487, -1736.8011, 1400.1903, 7.3641, 293.3916, -1, -1);
    Iter_Add(Vehicle[1], veh);
    Iter_Add(Vehicle[2], veh);
    Iter_Add(Vehicle[3], veh);
    //Végigmegyünk a második lista összes jármûvén
    foreachex (Vehicle[1], veh)
    {
        ChangeVehicleColor(veh, 0, 10);
    }
    //Végigmegyünk az elsõ lista összes jármûvén
    foreachex (Vehicle[0], veh)
    {
        ChangeVehicleColor(veh, 12, 20);
    }
}

 
Harmadik példa
Végigmegyünk az összes boton( csak 0.3 ).
 

foreach (Bot, botid)
{
    SetPlayerPos(botid, 0.0, 0.0, 10.0); //Minden NPC-t a pálya közepére helyezünk
}

 
Negyedik példa
Létrehozunk egy új iterátort 20 jármû számára, és megváltoztatjuk a színüket.
 

#include <foreach>
new Iterator:Vehicle<20>;
public OnGameModeInit()
{
    Iter_Add(Vehicle, AddStaticVehicle(454, -1364.0269, 1470.2139, 0.3568, 165.0191, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(484, -1394.0040, 1468.3309, 0.1742, 99.7403, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(484, -1404.9385, 1507.1971, -0.0963, 60.9265, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(446, -1603.1550, 1391.8168, -0.8820, 310.2346, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(446, -1698.8333, 1411.8612, -0.4988, 333.6676, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(446, -1710.4403, 1430.0688, -0.5722, 322.3057, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(473, -1623.9312, 1438.3147, -0.2109, 280.8999, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(473, -1609.0120, 1405.0123, -0.1395, 300.4936, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(487, -1651.4410, 1302.6608, 7.2126, 310.4509, -1, -1));
    Iter_Add(Vehicle, AddStaticVehicle(487, -1736.8011, 1400.1903, 7.3641, 293.3916, -1, -1));
    foreach (Vehicle, vid)
    {
        ChangeVehicleColor(vid, 0, 10);
    }
}

 

  • Idõeredmények
    Mint már említettem, ez a struktúra gyorsabb, mint az alap ciklusok,
itt a bizonyíték.Letöltéshttp://pastebin.com/2wduLfcq

Eredeti téma itt.
« Utoljára szerkesztve: 2012. Július 07. - 07:42:44 írta ChuckNorris »

[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #1 Dátum: 2011. Május 14. - 09:06:36 »
0
Jó kis, érthetõ leírás lett  ;) :problem:

[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #2 Dátum: 2011. Május 14. - 19:14:58 »
0
Szééééép  :)
De elfelejtetted kiemelni  ;)

Gang[St]e[R]

  • Vendég
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #3 Dátum: 2011. Május 19. - 17:15:52 »
0
Szép leírás ZeRo, már sokkal többet tudtam meg róla így!
Ha FS be írom muszály a foreach fölé írni a #define FILTERSCRIPT -et?
« Utoljára szerkesztve: 2011. Május 19. - 17:22:01 írta GangSteR] »

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #4 Dátum: 2011. Május 19. - 17:37:58 »
0
\" post=\"139152\" timestamp=\"1305818152\"]
Szép leírás ZeRo, már sokkal többet tudtam meg róla így!
Ha FS be írom muszály a foreach fölé írni a #define FILTERSCRIPT -et?
 
[/quote]
Igen.

Nem elérhető krisk

  • 2380
    • Profil megtekintése
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #5 Dátum: 2011. Június 30. - 12:38:25 »
0
Pár példád hibás, mivel nem lehet a foreach zárójelek után, és a vesszõk elé szóközt rakni.
 

foreach( Player, i ) {}

 
Helyett:
 

foreach(Player, i) {}

 
Néhány példában jól van megírva, néhányban rosszul.

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #6 Dátum: 2011. Június 30. - 14:26:17 »
0
Idézetet írta: krisk date=1309430305\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"8139\" data-ipsquote-contentclass=\"forums_Topic
Pár példád hibás, mivel nem lehet a foreach zárójelek után, és a vesszõk elé szóközt rakni.
 

foreach( Player, i ) {}

 
Helyett:
 

foreach(Player, i) {}

 
Néhány példában jól van megírva, néhányban rosszul.
 
Átkozott stílusok, kösz hogy szóltál. ;)

[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #7 Dátum: 2011. Június 30. - 14:53:51 »
0
Kicsit zavaros de asszem értem . Szóval ha ezt csinálom :
 
new randomplayer = Iter_Random( Player );
SendClientMessage(player,színxy,\"Te egy véletlenszerü kiválasztott vagy!\");

 
Akkor véletlenszerüen elküldi a szerveren vmeik embernek???

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #8 Dátum: 2011. Június 30. - 14:58:05 »
0

...
SendClientMessage( randomplayer, ...

 
Arra hivatkozol, amit elõtte deklaráltál. ;) ( A példában randomplayer )

Gang[St]e[R]

  • Vendég
[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #9 Dátum: 2011. Október 11. - 18:30:16 »
0
És ebben a foreach-ban nem lehet Iterátorokat egybe tenni?
Vagy hogy is mondjam, ilyet lehet foreach(Player, playerid || Bot, botid) mint az if-be vagy valami?

[Scripting Eszköz]foreach [Ciklus helyettesítõ]
« Válasz #10 Dátum: 2011. Október 11. - 18:53:50 »
0
4 alap Iterators van foreach.inc fájlban.
Iterators:
        Player - List of all players connected.
        Bot - List of all bots (npcs) connected.
        NPC - Alias of Bot.
        Character - All players and bots.
Úgy nem lehet hogy kettõt összeadsz te magad, e célból létre kell hozni még egyet, ami számolja az összeset amit majd le akarsz futtatni.
De az írásodból bot és player játékosokat akarsz egyszerre arra ott a Character.
[pawn]
foreach(Character, i);
[/pawn]

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal