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ásEz 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álataA 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
Értéket rendel hozzá a megadott iterátorhoz. A fentieket automatikusan kezeli.
Értéket töröl a megadott iterátorból. A fentieket automatikusan kezeli.
Teljesen kiürít egy iterátort. Minden értéket töröl.
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 ).
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.
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ásokA 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ókAz 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ákElsõ példaMultidimenzió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éldaMultidimenzió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éldaVé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éldaLé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.