Gta San Andreas MultiPlayer (samp) HUN
Navigation
     
Account
Felhasználónév:

Jelszó:
SúgóSúgó
Regisztráció
Elfelejtettem a jelszót
     
Kép
Szerver
Legyen ennek a weboldalnak saját samp szervere?

Igen
Nem
Szavazás állása
Lezárt szavazások
     
Friss

Utolsó módosítás
2013 máj. 19.
12:17

 

     
Más weblapok
 SA:MP Fórum
SA:MP Wiki
Google

     

PAWN Eszközök
     
[INC]Foreach

 

Foreach
 

Forrás: ZeRo, sampforum.hu

Bevezető

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és

    http://pastebin.com/2wduLfcq



    Eredeti téma itt.
     
Nézettség
Indulás: 2010-02-26
     
PAWN/Szkriptek
     
Tutorialok
     
Óra
     
Chat
Kérlek, felesleges dolgokat ne írj a chatbe!
Név:

Üzenet:
:)) :) :@ :? :(( :o :D ;) 8o 8p 8) 8| :( :'( ;D :$
     

Dryvit, hõszigetelés! Vállaljuk családi házak, nyaralók és egyéb épületek homlokzati szigetelését! 0630/583-3168 Hívjon!    *****    A legfrissebb hírek a Super Mario világából és a legteljesebb adatbázis a Mario játékokról.Folyamatosan bõvülõ tartalom.    *****    Gigágá! Márton napján is gyertek a Mesetárba! Nemcsak libát, de kacsát is kaptok! Játsszatok velünk!    *****    A Nintendo a Nintendo Music-kal megint valami kiváló dolgot hozott létre! Alaposan nagyító alá vettem, az eredmény itt.    *****    Leanderek, Parfümök, Olajok, és Szépségápolási termékek! Használd a LEVI10 kupont és kapj 10% kedvezményt!Megnyitottunk    *****    Megjelent a Nintendo saját gyártású órája, a Nintendo Sound Clock Alarmo! Ha kíváncsi vagy, mit tud, itt olvashatsz róla    *****    Megnyílt a webáruházunk! Parfümök, Szépségápolási termékek, Olajok mind egy helyen! Nyitási akciók, siess mert limitált!    *****    Az általam legjobbnak vélt sportanimék listája itt olvasható. Top 10 Sportanime az Anime Odyssey-n!    *****    Pont ITT Pont MOST! Pont NEKED! Már fejlesztés alatt is szebbnél szebb képek! Ha gondolod gyere less be!    *****    Megnyílt a webáruházunk! NYITÁSI AKCIÓK! Tusfürdõ+Fogkrém+Sampon+Izzadásgátló+multifunkcionális balzsam most csak 4.490!    *****    Új mese a Mesetárban! Téged is vár, gyere bátran!    *****    Veterán anime rajongók egyik kedvence a Vadmacska kommandó. Retrospektív cikket olvashatsz róla az Anime Odyssey blogban    *****    Parfümök, Olajok, Párologtatók mind egy weboldalon! Siess mert nyitási AKCIÓNK nem sokáig tart! Nagy kedvezmények várnak    *****    Dryvit, hõszigetelés! Vállaljuk családi házak, nyaralók és egyéb épületek homlokzati szigetelését! 0630/583-3168 Hívjon!    *****    Aki érdeklõdik a horoszkópja után, az nem kíváncsi, hanem intelligens. Rendeld meg most és én segítek az értelmezésben!    *****    A Múzsa, egy gruppi élményei a színfalak mögött + napi agymenések és bölcseletek    *****    KARATE OKTATÁS *** kicsiknek és nagyoknak *** Budapest I. II. XII.kerületekben +36 70 779-55-77    *****    Augusztus 26-án Kutyák Világnapja! Gyertek a Mesetárba, és ünnepeljétek kutyás színezõkkel! Vau-vau!    *****    A horoszkóp elemzésed utáni érdeklõdés, nem kíváncsiság hanem intelligencia. Rendeld meg és nem fogod megbánni. Katt!!!    *****    Cikksorozatba kezdtem a PlayStation történelmérõl. Miért indult nehezen a Sony karrierje a konzoliparban?