|
Foreach
Forrás: ZeRo, sampforum.hu
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és
http://pastebin.com/2wduLfcq
Eredeti téma itt.
| |