Slaughter
Умник
Здравствуйте, уважаемые посетители портала Pawno-info. Я был очень удивлён, когда не обнаружил на данном портале урока по работе с итераторами foreach. Уверен, что тема будет полезна. Тема рекомендована для скриптеров со средним уровнем знаний и выше.
Итераторы значительно повышают скорость перебора итераций в циклах(foreach отбрасывает лишние итерации).
Код вывода лога:
PHP:
#include <a_samp>
#include <foreach>
new Iterator:vehicles_in_stream[MAX_PLAYERS]<MAX_VEHICLES>;
main(){}
public OnGameModeInit()
{
Iter_Init(vehicles_in_stream);
Iter_Add(vehicles_in_stream[ 0 ], 7);
Iter_Add(vehicles_in_stream[ 0 ], 3);
print("Для MAX_VEHICLE = 10:");
for(new i = 0; i < 10; i++)
{
printf("i = %d",i);
}
print("foreach:");
foreach(new i: vehicles_in_stream[ 0 ])
{
printf("i = %d",i);
}
return 1;
}
[19:30:50] При MAX_VEHICLE = 10:
[19:30:50] i = 0
[19:30:50] i = 1
[19:30:50] i = 2
[19:30:50] i = 3
[19:30:50] i = 4
[19:30:50] i = 5
[19:30:50] i = 6
[19:30:50] i = 7
[19:30:50] i = 8
[19:30:50] i = 9
[19:30:50] foreach:
[19:30:50] i = 3
[19:30:50] i = 7
[19:30:50] i = 0
[19:30:50] i = 1
[19:30:50] i = 2
[19:30:50] i = 3
[19:30:50] i = 4
[19:30:50] i = 5
[19:30:50] i = 6
[19:30:50] i = 7
[19:30:50] i = 8
[19:30:50] i = 9
[19:30:50] foreach:
[19:30:50] i = 3
[19:30:50] i = 7
Работу итераторов мы рассмотрим на примере, т.к я считаю, что примеры отображают суть более наглядно.
Работа с примером:
На каждом РП сервере мы можем встретить систему закрывания дверей автомобиля(/lock), в подавляющей части модов, что я видел в паблике, для поиска нужного id автомобиля используется цикл:
PHP:
for(new i = 0; i < MAX_VEHICLES; i++)
Создаём сам итератор:
PHP:
new Iterator:vehicles_in_stream[MAX_PLAYERS]<MAX_VEHICLES>;
PHP:
public OnGameModeInit()
{
Iter_Init(vehicles_in_stream);
return 1;
}
Теперь мы должны внести значение в итератор при появлении автомобиля в стрим-зоне игрока.
Для этого мы воспользуемся функцией Iter_Add(name, value). Если мы пытаемся внести невалидное значение, либо уже существующее, то сервер игнорирует это действие.
PHP:
public OnVehicleStreamIn(vehicleid, forplayerid)//авто в стрим зоне игрока с id = forplayerid.
{
Iter_Add(vehicles_in_stream[forplayerid], vehicleid);//внесли
return 1;
}
Для этого существует функция Iter_Remove(name, value)
PHP:
public OnVehicleStreamOut(vehicleid, forplayerid)//авто покинуло стрим зону игрока с id = forplayerid.
{
Iter_Remove(vehicles_in_stream[forplayerid], vehicleid);//очистили
return 1;
}
PHP:
public OnPlayerDisconnect(playerid, reason)
{
if(Iter_Count(vehicles_in_stream[playerid]) != 0) Iter_Clear(vehicles_in_stream[playerid]);
return 1;
}
PHP:
foreach(new i: vehicles_in_stream[playerid])
Где ещё использовать? Использовать итераторы можно при работе, например,с чатами, где используются циклы с проверками игроков на команду/админку и т.п.
foreach.inc -
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Там же вы можете рассмотреть другие полезные функции, а так же ситуации, в которых можно использовать foreach, с примерами(я затронул лишь малую часть).
Любая критика приветствуется, аналогично с поправками.
Для тех, кто "в танке" - эта аптимизация, йоба.
Автор: Slaughter. Копирование материалов разрешено только с указанием автора.
Последнее редактирование:
