|
Foreach
Forrs: ZeRo, sampforum.hu
Bevezet
A foreach lecserli a ciklusokat( leginkbb a jtkosokra vonatkozkat ) gyorsabb, s mg hatkonyabb ciklusokra. Plda:
for( new i = 0; i != MAX_PLAYERS; ++i ) {
if (IsPlayerConnected( i ) ) {
printf( "Jtkos %d csatlakozva van", i );
}
}
Egyszeren ezz vlik:
foreach( Player, i ) {
printf( "Jtkos[%d] csatlakozva van", i );
}
Felhvnm a figyelmet, hogy ez nem csak egy egyszer definci, ami az eredeti ciklust illeszti be ms nven, hanem ez tulajdonkppen egy teljesen klnbz begyazs, ami jtkoslistzst hasznl, emiatt gyorsabb az eredeti rendszernl. St, a mkdsi elve miatt nem szmt a MAX_PLAYERS rtke, akr be van lltva a te szerveredhez, akr nincs; Ez a ciklusfajta mindig ugyanannyi id alatt fog lefutni, mivel ez CSAK a csatlakozott jtkosokat kezeli, res azonostkat nem.
Begyazs
Ez a fggvnyknyvtr ezt a rendszert hasznlja, teht mindssze ennyit kell csinlj:
#include <foreach>
Ezek utn mr hasznlhatod az j ciklust.
Ha filterszkriptben szeretnd hasznlni ezt a rendszert, akkor tedd a kvetkezt:
#define FILTERSCRIPT
#include <foreach>
Ha a forrsodban mr szerepel a FILTERSCRIPT definci, akkor gyzdj meg rla, hogy a foreach begyazsa FLTT legyen.
Deklarci
Hogy ltrehozz egy itertort( egy elem, amit a foreach segtsgvel hasznlhatsz ), hasznld a kvetkez kdot:
new Iterator:MyIterator<10>;
Ez ltre fogja hozni a "MyIterator" nev itertort, amihez 10 frhelyet rendel.
Figyelmedbe ajnlom, hogy ez a szintaxis ezen a kdon alapul, s formra hasonlt egy tlagos vltoz deklarlsra( tbbrt elemek hasznlata ), de ez nem egy tmb, gy az emberek nem esnek abba a hibba, hogy direkt mdon prblnak meg informcikhoz hozzfrni, teht a szerkezet fontos.
Hasznlata
A sajt itertorodat a kvetkez kppen hasznlhatod:
foreach( MyIterator, var ) {
printf( "Vltoz[%d] aktv", var );
}
rtkek hozzadsa:
Iter_Add( MyIterator, 7 );
rtkek trlse:
Iter_Remove( MyIterator, 7 );
Ha egy vletlenszer rtket szeretnl lekrdezni az itertorodbl GYORSAN( ez nagyon j vletlenszer jtkosok kivlasztsra ), csinld ezt:
Iter_Random( MyIterator );
Jtkoshoz:
new randomplayer = Iter_Random( Player );
Fggvnyek
-
Iterator:nv<mret>
Ltrehoz egy j itertort a megadott nvvel s mrettel. A rendszer automatikusan definilja a kvetkez itertorokat:
-
Player - Minden csatlakozott jtkos
-
Bot (0.3) - Minden csatlakozott bot
-
NPC (0.3) - Minden csatlakozott bot( ugyan az, mint a Bot )
-
Character (0.3) - Minden csatlakozott jtkos s bot
-
Iter_Add(name,value)
rtket rendel hozz a megadott itertorhoz. A fentieket automatikusan kezeli.
-
Iter_Remove(name,value)
rtket trl a megadott itertorbl. A fentieket automatikusan kezeli.
-
Iter_Clear(name)
Teljesen kirt egy itertort. Minden rtket trl.
-
Iter_Random(name)
Visszatr egy vletlenszer rtkkel a megadott itertorbl. Hasznos vletlenszer jtkosok kivlasztshoz( ez sokkal gyorsabb, mint a tbbi ehhez hasonl mdszer, a kd struktrja miatt ).
-
Iter_Count(name)
Visszatr egy megadott itertor elemeinek szmval( pldul hny csatlakozott jtkos van a szerveren ) - NAGYON gyorsan
-
IteratorArray:name[num]<size>
Ltrehoz egy j multidimenzis itertort a megadott nvvel, s a maximlis trolsi mrettel.
-
Iter_Init(name)
Ha ltrehoztl egy multidimenzis itertort, akkor ezt a fggvnyt meg KELL hvnod, mieltt brmit is raknl bele.
-
Iter_Func2(name,index,pars)
Felhvom a figyelmet, hogy ezek a fggvnyek el lettek tvoltva a legjabb verziban - most mr csak szimpln meg kell indexelned a tmbt.
Ha a "2" szerepel a fenti fggvnyek vgn, s az itertorod vgn( de a paramterek ELTT ) egy index ll, akkor multidimenzis itertort kapsz. Pldul:
new IteratorArray:My2d[3]<5>;
Iter_Init2(My2d);
Iter_Add2(My2d, 1, 4);
Ezzel ltrehozol 3 5-elemes itertort, s a msodikhoz hozzadod a 4-et rtkknt.
Fordtsi belltsok
A begyazs eltt definilhatsz pr dolgot, hogy testreszabd a foreach funkciit.
-
FOREACH_NO_BOTS
Ha csak jtkosokra akarod vonatkoztatni a ciklusaidat, akkor hasznld ezt a defincit, hogy megszntesd a kdot, ami a botokat(NPC) nzi.
-
FOREACH_NO_PLAYERS
Ezzel megsznteted a jtkosok S botok szmllst, gy csak a f funkcik lesznek elrhetk.
-
Tbbrt dimenzik
Az elz kiads minden fggvnynek volt egy "Iter_Func2" vltozata - ezek most trlve lettek egy mg egyrtelmbb szintaxis ltrehozsnak rdekben:
Mostantl ltrehozhatsz tbbrt itertorokat is. Pldul egy itertorokbl ll tmbt, ami a jtkosok jrmit tartalmazza( habr volna jobb javaslatom is ennek megoldsra ):
foreach( PlayerVehicles[ playerid ], veh ) {
//Itt csinlhatsz valamit az adott jtkos jrmvvel
}
Multidimenzis itertorok ltrehozshoz meg kell hvnod ezt a fggvnyt:
Iter_Init( iterator );
Az itertor hasznlata eltt. Az egyszer itertorokat inicializlhatod a fordtsi id kzben, de a multidimenzisokat nem.
Pldk
Els plda
Multidimenzis itertorok. Ezzel egy itertorokbl ll tmbt hozhatsz ltre:
#include <foreach>
new IteratorArray:Vehicle[4]<20>;
public OnGameModeInit()
{
//Elszr EZT KELL meghvnod multidimenzis itertoroknl.
Iter_Init(Vehicle);
//Hozzads az ELS listhoz
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));
//Hozzads a MSODIK listhoz
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));
//Hozzads a HARMADIK listhoz
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));
//Hozzads a NEGYEDIK listhoz
Iter_Add(Vehicle[3], AddStaticVehicle(487, -1736.8011, 1400.1903, 7.3641, 293.3916, -1, -1));
//Vgigmegynk a msodik lista sszes jrmvn
foreach (Vehicle[1], veh)
{
ChangeVehicleColor(veh, 0, 10);
}
//Vgigmegynk az els lista sszes jrmvn
foreach (Vehicle[0], veh)
{
ChangeVehicleColor(veh, 12, 20);
}
}
Msodik plda
Multidimenzis itertorok. Ltrehozunk egy itertorokbl ll tmbt, s a jrmveket egy sszetett listhoz hozzadjuk.
#include <foreach>
new IteratorArray:Vehicle[4]<20>;
public OnGameModeInit()
{
//Elszr EZT KELL meghvnod multidimenzis itertoroknl.
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);
//Vgigmegynk a msodik lista sszes jrmvn
foreachex (Vehicle[1], veh)
{
ChangeVehicleColor(veh, 0, 10);
}
//Vgigmegynk az els lista sszes jrmvn
foreachex (Vehicle[0], veh)
{
ChangeVehicleColor(veh, 12, 20);
}
}
Harmadik plda
Vgigmegynk az sszes boton( csak 0.3 ).
foreach (Bot, botid)
{
SetPlayerPos(botid, 0.0, 0.0, 10.0); //Minden NPC-t a plya kzepre helyeznk
}
Negyedik plda
Ltrehozunk egy j itertort 20 jrm szmra, s megvltoztatjuk a sznket.
#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);
}
}
Ideredmnyek
Mint mr emltettem, ez a struktra gyorsabb, mint az alap ciklusok, itt a bizonytk.
Letlts
http://pastebin.com/2wduLfcq
Eredeti tma itt.
| |