PDA

Просмотр полной версии : [Вопрос] Правильна ли созданна система Анти БанниХоп



denis01
03.09.2014, 10:10
forward AntiBH(playerid);


#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))


if(PRESSED( KEY_JUMP ) && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid))
{
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
}
return 1;
}


public AntiBH(playerid) return ApplyAnimation( playerid, "PED", "getup_front", 4.1, 0, 0, 0, 0, 0 );

Nurick
03.09.2014, 10:25
При падении с высокой высоты используя вашу систему Анти Бани хоп можно багоюзить, используя клавиши KEY_JUMP, KEY_SPRINT прыгая с высоты урон персонажу не будет наноситься, так как используеться анимация Анти Бани хоп.

denis01
03.09.2014, 21:03
А сама то команда созданна правильно?? кроме этого больше никаких проблем не будет???

denis01
08.09.2014, 08:04
Up....

DeimoS
08.09.2014, 13:14
Лучше уж тогда проверять анимацию прыжка + кнопку и уже на основе этого делать проверку. И массив нужен, который будет отвечать за то, чтоб по 500 таймеров игроки не спамили.

denis01
08.09.2014, 14:50
Лучше уж тогда проверять анимацию прыжка + кнопку и уже на основе этого делать проверку. И массив нужен, который будет отвечать за то, чтоб по 500 таймеров игроки не спамили.

forward AntiBH(playerid);


#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))


if(PRESSED( KEY_JUMP ) && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid) && GetPVarInt(playerid, "Time") == 0)
{
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetPVarInt(playerid, "Time", 1);
SetTimerEx("AntiBH", 500, 0, "d", playerid);
}
return 1;
}


public AntiBH(playerid)
{
ApplyAnimation( playerid, "PED", "getup_front", 4.1, 0, 0, 0, 0, 0 );
DeletePVar(playerid, "Time");
return 1;
}


Так?

underwoker
08.09.2014, 15:16
forward AntiBH(playerid);


#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))


if(PRESSED( KEY_JUMP ) && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid) && GetPVarInt(playerid, "Time") == 0)
{
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetPVarInt(playerid, "Time", 1);
SetTimerEx("AntiBH", 500, 0, "d", playerid);
}
return 1;
}


public AntiBH(playerid)
{
ApplyAnimation( playerid, "PED", "getup_front", 4.1, 0, 0, 0, 0, 0 );
DeletePVar(playerid, "Time");
return 1;
}


Так?
Сказали ведь без таймеров.
http://wiki.sa-mp.com/wiki/GetPlayerAnimationIndex

DeimoS
08.09.2014, 17:30
А если и с таймером, то точно не на pVar

#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
new anti_bh_time[MAX_PLAYERS char];


if(PRESSED( KEY_JUMP ) && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid) && anti_bh_time{playerid} == 0)
{
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
anti_bh_time{playerid} = 1;
SetTimerEx("AntiBH", 500, 0, "d", playerid);
}
return 1;
}


forward AntiBH(playerid);
public AntiBH(playerid)
{
ApplyAnimation( playerid, "PED", "getup_front", 4.1, 0, 0, 0, 0, 0 );
anti_bh_time{playerid} = 0;
return 1;
}

Но так вы всё равно не исправите баг с тем, когда люди будут использовать ваш фикс при падении с высоты и выживать

- - - Добавлено - - -

А с отловом индексов код будет выглядеть как-то так

switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}

denis01
08.09.2014, 21:57
А если и с таймером, то точно не на pVar

#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
new anti_bh_time[MAX_PLAYERS char];


if(PRESSED( KEY_JUMP ) && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid) && anti_bh_time{playerid} == 0)
{
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
anti_bh_time{playerid} = 1;
SetTimerEx("AntiBH", 500, 0, "d", playerid);
}
return 1;
}


forward AntiBH(playerid);
public AntiBH(playerid)
{
ApplyAnimation( playerid, "PED", "getup_front", 4.1, 0, 0, 0, 0, 0 );
anti_bh_time{playerid} = 0;
return 1;
}

Но так вы всё равно не исправите баг с тем, когда люди будут использовать ваш фикс при падении с высоты и выживать

- - - Добавлено - - -

А с отловом индексов код будет выглядеть как-то так

switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
Спасибо большое

OKStyle
08.09.2014, 22:09
if(newkeys & KEY_JUMP && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid)) return ApplyAnimation(playerid, "PED", "getup_front", 4.0, 0, 0, 0, 0, 0, 1);
}

И добавить проверку на ускорение по z.

Пельмень
09.09.2014, 19:53
А если и с таймером, то точно не на pVar

#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
new anti_bh_time[MAX_PLAYERS char];


if(PRESSED( KEY_JUMP ) && newkeys & KEY_SPRINT)
{
if(!IsPlayerInAnyVehicle(playerid) && anti_bh_time{playerid} == 0)
{
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
anti_bh_time{playerid} = 1;
SetTimerEx("AntiBH", 500, 0, "d", playerid);
}
return 1;
}


forward AntiBH(playerid);
public AntiBH(playerid)
{
ApplyAnimation( playerid, "PED", "getup_front", 4.1, 0, 0, 0, 0, 0 );
anti_bh_time{playerid} = 0;
return 1;
}

Но так вы всё равно не исправите баг с тем, когда люди будут использовать ваш фикс при падении с высоты и выживать

- - - Добавлено - - -

А с отловом индексов код будет выглядеть как-то так

switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}

Свитчить функцию? ата-та так делать :)

Salvacore
09.09.2014, 20:49
Свитчить функцию? ата-та так делать :)
А почему нет?

Пельмень
09.09.2014, 21:15
А почему нет?

А зачем вызывать функцию каждый раз? Это лишняя затрата времени, если записать данные в переменную, перебор будет значительно быстрее!

MR_BEN
09.09.2014, 21:22
А зачем вызывать функцию каждый раз? Это лишняя затрата времени, если записать данные в переменную, перебор будет значительно быстрее!

При каждом вызове switch будет использоваться функция GetPlayerAnimationIndex?

L0ndl3m
09.09.2014, 21:37
А зачем вызывать функцию каждый раз? Это лишняя затрата времени, если записать данные в переменную, перебор будет значительно быстрее!
Если честно, не знал, что несколько раз вызывается функция. Обычно было предположение, что компилятор сам создаёт "переменную" при начале проверки случаев, а далее её проверяет.


При каждом вызове switch будет использоваться функция GetPlayerAnimationIndex?
Сейчас проверил тесты скорости, действительно...

DeimoS
09.09.2014, 21:37
А зачем вызывать функцию каждый раз? Это лишняя затрата времени, если записать данные в переменную, перебор будет значительно быстрее!

Таки не вводите людей в заблуждение. Switch вызывает функцию 1 раз и уже работает с результатом. Даже если мы введём 100 членов для сравнения.
Вот вам банальный код как пример:

stock GetPlayerAnimationIndexEx(playerid)
{
print("\nФункция GetPlayerAnimationIndex вызвана\n");
return GetPlayerAnimationIndex(playerid);
}
#define GetPlayerAnimationIndex GetPlayerAnimationIndexEx

public OnPlayerConnect(playerid)
{
switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 12, 123, 357:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 11, 5, 65:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 12, 123, 357:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 11, 5, 65:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
return 1;
}
В консоль выдаст ровно 2 сообщения. Когда такой код:

stock GetPlayerAnimationIndexEx(playerid)
{
print("\nФункция GetPlayerAnimationIndex вызвана\n");
return GetPlayerAnimationIndex(playerid);
}
#define GetPlayerAnimationIndex GetPlayerAnimationIndexEx

public OnPlayerConnect(playerid)
{
if(GetPlayerAnimationIndex(playerid) == 1195 || GetPlayerAnimationIndex(playerid) == 1196 || GetPlayerAnimationIndex(playerid) == 1197)
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
return 1;
}
Естественно выдаст 3. Хотя может вы говорите не о том...

Пельмень
09.09.2014, 21:41
При каждом вызове switch будет использоваться функция GetPlayerAnimationIndex?

Именно! Доступ к переменной, в которой хранится значение, которое вернула функция, будет осуществляться в разы быстрее, также, можно записывать в переменную данные из одномерных, двумерных и т.д, массивов, для получения результата. т.к к одномерным, двумерным и т.д массивам доступ осуществляется медненнее, чем к обыкновенным переменным.

DeimoS
09.09.2014, 21:48
Сейчас проверил тесты скорости, действительно...

Не знаю как вы проверяли... Вот вам мой тест. При записи в переменную время увеличилось (оно и понятно, ибо 2 новых действия добавляем ко всему)

public OnPlayerConnect(playerid)
{
new time = GetTickCount();
for(new i; i != 1000000; i++)
{
switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 12, 123, 357:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 11, 5, 65:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
}
printf("Цикл 1 сработал за %d мс", GetTickCount()-time);

time = GetTickCount();
for(new i; i != 1000000; i++)
{
new index = GetPlayerAnimationIndex(playerid);
switch(index)
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 12, 123, 357:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 11, 5, 65:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
}
printf("Цикл 2 сработал за %d мс\n", GetTickCount()-time);
return 1;
}


http://breedpmnr.ru/i/7D7D4A

Пельмень
09.09.2014, 21:53
Таки не вводите людей в заблуждение. Switch вызывает функцию 1 раз и уже работает с результатом. Даже если мы введём 100 членов для сравнения.
Вот вам банальный код как пример:

stock GetPlayerAnimationIndexEx(playerid)
{
print("\nФункция GetPlayerAnimationIndex вызвана\n");
return GetPlayerAnimationIndex(playerid);
}
#define GetPlayerAnimationIndex GetPlayerAnimationIndexEx

public OnPlayerConnect(playerid)
{
switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 12, 123, 357:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 11, 5, 65:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
switch(GetPlayerAnimationIndex(playerid))
{
case 1195, 1196, 1197:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 12, 123, 357:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
case 11, 5, 65:
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
}
return 1;
}
В консоль выдаст ровно 2 сообщения. Когда такой код:

stock GetPlayerAnimationIndexEx(playerid)
{
print("\nФункция GetPlayerAnimationIndex вызвана\n");
return GetPlayerAnimationIndex(playerid);
}
#define GetPlayerAnimationIndex GetPlayerAnimationIndexEx

public OnPlayerConnect(playerid)
{
if(GetPlayerAnimationIndex(playerid) == 1195 || GetPlayerAnimationIndex(playerid) == 1196 || GetPlayerAnimationIndex(playerid) == 1197)
{
ClearAnimations(playerid, 0);
ApplyAnimation( playerid, "PED", "KO_skid_back", 4.1, 0, 0, 0, 0, 0 );
SetTimerEx("AntiBH", 500, 0, "d", playerid);
return 1;
}
return 1;
}
Естественно выдаст 3. Хотя может вы говорите не о том...

Это аналог if, else if, else if (function() == 1) else if (function() == 2) else if (function() == 3) - функция будет вызвана 3 раза, также и в свитче, если я не ошибаюсь, конечно же.

Salvacore
09.09.2014, 21:59
А зачем вызывать функцию каждый раз? Это лишняя затрата времени, если записать данные в переменную, перебор будет значительно быстрее!
Пасиб.

DeimoS
09.09.2014, 22:02
Это аналог if, else if, else if (function() == 1) else if (function() == 2) else if (function() == 3) - функция будет вызвана 3 раза, также и в свитче, если я не ошибаюсь, конечно же.

Я же дал пример. Вставьте его в мод и посмотрите. А если лень - я в том же сообщении написал всё по поводу того, как всё будет работать

L0ndl3m
09.09.2014, 22:17
DeimoS, инициализируй переменную index вне цикла, и увидишь результат, при новой итерации присваиваешь одно и тоже значение, смысл?

DeimoS
09.09.2014, 22:40
DeimoS, инициализируй переменную index вне цикла, и увидишь результат, при новой итерации присваиваешь одно и тоже значение, смысл?

Лол, я ожидал чего-то подобного. Только вот как вы себе представляете ваш код без цикла? Где записывать ID анимации, чтоб его потом сверять при нажатии нужных кнопок?
Каждая итерация соответствует одному нажатию нужных нам кнопок. И чтоб всё работало как надо, нам нужно узнавать ID проигрываемой анимации при каждом из нажатий. Мой код делает именно это. А ваш?

Ваш тест никак не отражает работу switch. Разница в скорости достигается именно тем, что вы вызываете функцию вне цикла и в цикле. И разница будет даже если вы просто будете выводить полученное значение в консоль, а не проверять его в switch. В общем, вы проверяли не то :)

- - - Добавлено - - -

И да, я же уже дал вам код, который может показать то, сколько раз вызывается функция. И там видно, что switch вызывает функцию ровно 1 раз. Какие ещё могут быть вопросы то? Не вводите людей в заблуждение :(

Пельмень
09.09.2014, 22:43
Код:


new time = GetTickCount();
new a = 0;
for(new i; i != 1000000; i++)
{
switch (function()) {
case 1..5: a = 1;
}
}
printf("Цикл 1 сработал за %d мс", GetTickCount()-time);

time = GetTickCount();
new func = function();
for(new i; i != 1000000; i++)
{
switch (func) {
case 1..5: a = 1;
}
}
printf("Цикл 2 сработал за %d мс", GetTickCount()-time);



stock function () {
return 5;
}

Результаты:



[23:32:17] Цикл 1 сработал за 43 мс
[23:32:17] Цикл 2 сработал за 30 мс

Операционная система:


Linux inn0va 3.17.0-031700rc4-generic #201409071935 SMP Mon Sep 8 01:02:20 UTC 2014 i686 i686 i686 GNU/Linux

- - - Добавлено - - -

Очевидно, что switch вызывает функцию при каждой проверке.

DeimoS
09.09.2014, 22:43
Ещё один...
А теперь проверьте так

new time = GetTickCount();
new a = 0;
for(new i; i != 1000000; i++)
{
switch (function()) {
case 1..5: a = 1;
}
}
printf("Цикл 1 сработал за %d мс", GetTickCount()-time);

time = GetTickCount();
new func;
for(new i; i != 1000000; i++)
{
func = function();
switch (func) {
case 1..5: a = 1;
}
}
printf("Цикл 2 сработал за %d мс", GetTickCount()-time);
дабы проверялся именно switch, а не факт того, что обращение к функции 1 раз, быстрее, нежели 1000000

Пельмень
09.09.2014, 22:54
Разумеется, такой такой вариант будет медленнее, хотя-бы потому что, каждый раз переменной будет присваиваться значение, но, опять-же, для чего присваивать значение каждый раз? По моему это бессмысленно.

DeimoS
09.09.2014, 23:01
Разумеется, такой такой вариант будет медленнее, хотя-бы потому что, каждый раз переменной будет присваиваться значение, но, опять-же, для чего присваивать значение каждый раз? По моему это бессмысленно.

Тогда причём тут вообще switch? Вот тут

new time = GetTickCount();
new string[3];
for(new i; i != 100000; i++)
{
format(string, sizeof(string), "%d", function());
SendClientMessageToAll(-1, string);
}
printf("Цикл 1 сработал за %d мс", GetTickCount()-time);

time = GetTickCount();
new func = function();
for(new i; i != 100000; i++)
{
format(string, sizeof(string), "%d", func);
SendClientMessageToAll(-1, string);
}
printf("Цикл 2 сработал за %d мс", GetTickCount()-time);
Второй вариант тоже будет работать быстрее, нежели первый. Вы отчаянно не хотите читать мои сообщения и вникать в них, как я посмотрю...

Пельмень
09.09.2014, 23:10
Хорошо, до этого момента, я думал, что switch при каждой проверке будет вызывать функцию заного, потому что свитч переменной в разы быстрее, чем свитч функции напрямую, выйгрыш в скорости заметен. Конечно, если не присваивать переменной в цикле значение функции по новой, в практике, по крайней мере такого я никогда не видел.

DeimoS
09.09.2014, 23:15
Повторяю в сотый раз. Это не switch быстрее становится, это вы убираете из тела цикла обращение к функции. Это как сравнивать

for(new i; i < GetMaxPlayers(); i++)
и

for(new i = GetMaxPlayers(); i != -1; i--)
Разница тут в том, что в первом случае мы вызываем функцию GetMaxPlayers каждую итерацию, а во втором - нет.
switch же оптимизирован сам по себе и не требует каких-то лишних переменных. Да и как вы сделаете то, что требуется автору сей темы, без постоянного обращения к GetPlayerAnimationIndex?

Пельмень
09.09.2014, 23:30
Повторяю в сотый раз. Это не switch быстрее становится, это вы убираете из тела цикла обращение к функции. Это как сравнивать

for(new i; i < GetMaxPlayers(); i++)
и

for(new i = GetMaxPlayers(); i != -1; i--)
Разница тут в том, что в первом случае мы вызываем функцию GetMaxPlayers каждую итерацию, а во втором - нет.
switch же оптимизирован сам по себе и не требует каких-то лишних переменных. Да и как вы сделаете то, что требуется автору сей темы, без постоянного обращения к GetPlayerAnimationIndex?

Что-то я не припомню, чтобы я говорил, ЧТО SWITCH становится быстрее, это же очевидный бред, сказать, что выбирающий оператор switch будет быстрее, чем выбирающий оператор switch. Тавтология какая-то получается. Может быть это и так, что switch не требует лишних переменных, однако, если использовать if, будет другая история. А использовать switch, как единственный оператор выбора в коде - будет полнейшим бредом, собственно, изначально я хотел сказать про другое.

DeimoS
10.09.2014, 06:12
Что-то я не припомню, чтобы я говорил, ЧТО SWITCH становится быстрее, это же очевидный бред, сказать, что выбирающий оператор switch будет быстрее, чем выбирающий оператор switch. Тавтология какая-то получается. Может быть это и так, что switch не требует лишних переменных, однако, если использовать if, будет другая история. А использовать switch, как единственный оператор выбора в коде - будет полнейшим бредом, собственно, изначально я хотел сказать про другое.

Так тогда что вы пытались сказать то? Покажите свой вариант кода, где значение функции будет вызываться вне switch. Ведь вы об этом изначально говорили

А зачем вызывать функцию каждый раз? Это лишняя затрата времени, если записать данные в переменную, перебор будет значительно быстрее!