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 :$
     

A legfrissebb hírek Super Mario világából, plusz információk, tippek-trükkök, végigjátszások!    *****    Ha hagyod, hogy magával ragadjon a Mario Golf miliõje, akkor egy egyedi és életre szóló játékélménnyel leszel gazdagabb!    *****    A horoszkóp a lélek tükre, nagyon fontos idõnként megtudni, mit rejteget. Keress meg és nézzünk bele együtt. Várlak!    *****    Dryvit, hõszigetelés! Vállaljuk családi házak, lakások, nyaralók és egyéb épületek homlokzati szigetelését!    *****    rose-harbor.hungarianforum.com - rose-harbor.hungarianforum.com - rose-harbor.hungarianforum.com    *****    Vérfarkasok, boszorkányok, alakváltók, démonok, bukott angyalok és emberek. A világ oly' színes, de vajon békés is?    *****    Az emberek vakok, kiváltképp akkor, ha olyasmivel találkoznak, amit kényelmesebb nem észrevenni... - HUNGARIANFORUM    *****    Valahol Delaware államban létezik egy város, ahol a természetfeletti lények otthonra lelhetnek... Közéjük tartozol?    *****    Minden mágia megköveteli a maga árát... Ez az ár pedig néha túlságosan is nagy, hogy megfizessük - FRPG    *****    Why do all the monsters come out at night? - FRPG - Why do all the monsters come out at night? - FRPG - Aktív közösség    *****    Az oldal egy évvel ezelõtt költözött új otthonába, azóta pedig az élet csak pörög és pörög! - AKTÍV FÓRUMOS SZEREPJÁTÉK    *****    Vajon milyen lehet egy rejtélyekkel teli kisváros polgármesterének lenni? És mi történik, ha a bizalmasod árul el?    *****    A szörnyek miért csak éjjel bújnak elõ? Az ártatlan külsõ mögött is lapulhat valami rémes? - fórumos szerepjáték    *****    Ünnepeld a magyar költészet napját a Mesetárban! Boldog születésnapot, magyar vers!    *****    Amikor nem tudod mit tegyél és tanácstalan vagy akkor segít az asztrológia. Fordúlj hozzám, segítek. Csak kattints!    *****    Részletes személyiség és sors analízis + 3 éves elõrejelzés, majd idõkorlát nélkül felteheted a kérdéseidet. Nézz be!!!!    *****    A horoszkóp a lélek tükre, egyszer mindenkinek érdemes belenéznie. Ez csak intelligencia kérdése. Tedd meg Te is. Várlak    *****    Új kínálatunkban te is megtalálhatod legjobb eladó ingatlanok között a megfelelõt Debrecenben. Simonyi ingatlan Gportal    *****    Szeretnél egy jó receptet? Látogass el oldalamra, szeretettel várlak!    *****    Minõségi Homlokzati Hõszigetelés. Vállaljuk családi házak, lakások, nyaralók és egyéb épületek homlokzati szigetelését.