В данном уроке научимся использовать функцию GetPlayerKeys. Вы спросите почему бы просто не воспользоваться колбэком OnPlayerKeyStateChange? Отвечу, бывают задачи, которые без данной функции нельзя решить. Например подобный скрипт как ColorMenu by stepmex.
Для начала разберем параметры: playerid - ID игрока, к которому применяют функцию keys - Набор битов, содержащий кнопку updown - Кнопки Вверх\Вниз leftright - Кнопки Влево Вправо
Общий пример использования данной функции:
Quote
forward buttons(); public OnGameModeInit() { SetTimer("buttons",1000,true); }
public buttons() { new keys,updown,leftright; for (new idx=GetMaxPlayers();idx>=0;--idx) { if(IsPlayerConnected(idx)) { GetPlayerKeys(idx,keys,updown,leftright); if(updown>0)SendClientMessage(idx,0xFFFFFFFF,"-Вы нажали на кнопку - \"Стрелка вверх\""); else if(updown<0)SendClientMessage(idx,0xFFFFFFFF,"-Вы нажали на кнопку - \"Стрелка вниз\""); if(leftright>0)SendClientMessage(idx,0xFFFFFFFF,"-Вы нажали на кнопку - \"Стрелка вправо\""); else if(leftright<0)SendClientMessage(idx,0xFFFFFFFF,"-Вы нажали на кнопку - \"Стрелка влево\""); } } }
P.S. Надеюсь всем все станет понятно, и перестанут мне ломиться в аську и в ЛС с таким вопросом. Чтобы было меньше вопросов буду постепенно писать уроки.
Спор на форуме, все равно что олимпиада среди умственно отсталых: даже если ты победил, ты все равно гермофродит. Хочешь остаться при своем мнении - держи его при себе.
ZZiGGi, объясни разницу между прямым(0,1,2,3...max_players) и обратным{max_players,....,3,2,1,0) циклированием? по мне как хрен редьки не слаще, а разве что прикольней.
объясни разницу между прямым(0,1,2,3...max_players) и обратным{max_players,....,3,2,1,0) циклированием? по мне как хрен редьки не слаще, а разве что прикольней.
в этом разницы 0. Но в твоем примере, ф-ия GetMaxPlayers() будет вызываться GetMaxPlayers() раз, а в моем примере, лишь 1
Likoniko ты проверял, какие значения может вернуть данная функция в updown leftright? Там заметь стоит меньше нуля, либо больше нуля, значит функция далеко не возвращает только два значения -1 или же 1. Можно конечно с этой конструкцией сделать, но, нужно выяснить максимальный диапазон ухода за отрицательную зону и за положительную.
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Сообщение отредактировал toneysix - Пятница, 29.04.2011, 11:18
Likoniko это уже другой разговор, здесь имеется ввиду специальные ключи, которые определяются авто вызовом - http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange Можно сделать с конструкцией, но тогда определить, кроме, как одной нажатой клавиши будет нельзя, то есть если игрок нажмет к примеру KEY_WALK и KEY_LOOK_BEHIND, сработает только то, что было нажато первым, в данном случаи, чтобы такого не было, нужно сравнить биты с помощью поразрядного оператора - И (&), например if(newkeys & KEY_LOOK_BEHIND), а switch будет лишь равнять переменные.
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Likoniko будет тоже самое, если игрок держит две клавиши, то уже сравнить с обычным оператором сравнения (==), тот же switch нельзя, здесь нужно использовать ТОЛЬКО ПОРАЗРЯДНЫЙ ОПЕРАТОР И - &, так как мы имеем дело с битами в конце концов, то есть при нажатии двух клавиш например KEY_CROUCH, которая равняется двум, и KEY_FIRE, которая равняется трем, уже невозможно сравнить обычным оператором сравнения, так как там уже не будет числа 2 и 3, поэтому и нужно использовать побитовое сравнение. P.S: Можно создавать шаблоны каждых нажатых клавиш между собой, но подумай, сколько на это уйдет времени, зачем заниматься такой порнографией, когда есть поразрядные операции.
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Сообщение отредактировал toneysix - Пятница, 29.04.2011, 11:36