Просмотр полной версии : [Вопрос] Как отловить одновременное зажатие двух клавиш?
Edward Morra
29.07.2016, 17:40
Сижу битый день и не могу понять смысл своей рукожопности.
Я никак не могу отследить в OnPlayerKeyStateChange зажатие KEY_FIRE и KEY_HANDBRAKE одновременно.
Т.е я требую от системы не просто пропустить при зажатии, а циклично для системы чтобы игрок мог тушить.
if(newkeys & KEY_FIRE && newkeys & KEY_HANDBRAKE)
{
Твой код
}
Edward Morra
29.07.2016, 18:39
if(newkeys & KEY_FIRE && newkeys & KEY_HANDBRAKE)
{
Твой код
}
Отследит лишь одно нажатие а не зажатие данных кнопок...
vovandolg
29.07.2016, 18:41
Твоё решение кроется вот тут (http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange).
А не так понял вопроса. Извиняюсь.
Edward Morra
29.07.2016, 18:45
Твоё решение кроется вот тут (http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange).
Твоя острота по использовании Wiki Samp тут не уместна. Пробывал, толков ноль.
vovandolg
29.07.2016, 18:54
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_HANDBRAKE | KEY_FIRE))
{
print("Вывожу данные при нажатии ПКМ + ЛКМ");
}
return 1;
}
У меня всё работает вот так, попробуйте в начало паблика поставить такой код
Edward Morra
29.07.2016, 18:55
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
if(PRESSED(KEY_HANDBRAKE | KEY_FIRE))
{
print("Вывожу данные при нажатии ПКМ + ЛКМ");
}
У меня всё работает вот так, попробуйте в начало паблика поставить такой код
Хорошо, зажми теперь их и посмотри. Если консоль зафлудит то твой метод работает, если же там будет мало записей то он реагирует лишь на количество нажатий , а не на зажатие.
Твоя острота по использовании Wiki Samp тут не уместна. Пробывал, толков ноль.
Что ты пробовал? Может ты не сюда (http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange#Simplification) смотрел?
- - - Добавлено - - -
Хорошо, зажми теперь их и посмотри. Если консоль зафлудит то твой метод работает, если же там будет мало записей то он реагирует лишь на количество нажатий , а не на зажатие.
Тогда причём здесь OnPlayerKeyStateChange? Это нужно делать в таймере или OnPlayerUpdate, используя функцию GetPlayerKeys с постоянной проверкой на зажатие.
Edward Morra
29.07.2016, 19:02
Что ты пробовал? Может ты не сюда (http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange#Simplification) смотрел?
Именно сюда...
- - - Добавлено - - -
Что ты пробовал? Может ты не сюда (http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange#Simplification) смотрел?
- - - Добавлено - - -
Тогда причём здесь OnPlayerKeyStateChange? Это нужно делать в таймере или OnPlayerUpdate, используя функцию GetPlayerKeys с постоянной проверкой на зажатие.
Пример, можно?
vovandolg
29.07.2016, 19:03
Ему мышку надо проверить, а не клавиатуру, GetPlayerKeys отпадает...
Просто юзер не определился и не написал точно что он хочет чтобы клавиши при нажатии выводили или при зажатии...
Я дал рабочий пример на нажатие кнопок, но если порыскать по ссылке которую я дал можно сделать и на зажатие
Ему мышку надо проверить, а не клавиатуру, GetPlayerKeys отпадает...
Кнопки на мыши - это такие же кнопки, как и на клавиатуре, ничего не отпадает.
Пример, можно?
#define HOLDING_DELAY 300
new gPreviousKeyTime[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
new current_time = GetTickCount();
if (current_time >= gPreviousKeyTime[playerid] + HOLDING_DELAY) {
new keys, updown, leftright;
GetPlayerKeys(playerid, keys, updown, leftright);
if (keys & (KEY_HANDBRAKE | KEY_FIRE)) {
SendClientMessage(playerid, -1, "HOLDING");
}
gPreviousKeyTime[playerid] = current_time;
}
return 1;
}
Используя макрос, что имеется в wiki.sa-mp.com, можно отследить момент, когда игрок зажал кнопку и когда отпустил.
В момент нажатия делаем следующее:
SetTimerEx("@___ThisIsTimer", 1000, false, "i", playerid);
SetPVarInt(playerid, "KrytorNazvaniePridymalDa?", 1);
И вызываемую функцию делаем такой:
@___ThisIsTimer(playerid);
@___ThisIsTimer(playerid)
{
if(!GetPVarInt(playerid, "KrytorNazvaniePridymalDa?")) return 1;
// Тут код, который тебе нужно повторять пока зажаты кнопки
return SetTimerEx("@___ThisIsTimer", 1000, false, "i", playerid);
}
А в момент, когда игрок отжал клавиши:
DeletePVar(playerid, "KrytorNazvaniePridymalDa?");
Это лишь пример. Можно то же самое провернуть, только с зацикленным таймером и KillTimer в момент, когда игрок отпустил клавишу (то бишь, без pVar).
Общий смысл в том, что когда игрок зажимает клавиши, мы запускаем таймер и повторяем его, пока наш "маячок" активен (pVar равен 1). А как только игрок отпускает клавишу, тушим "маячок" (удаляем pVar), тем самым прерывая работу таймера
Edward Morra
30.07.2016, 19:26
Кнопки на мыши - это такие же кнопки, как и на клавиатуре, ничего не отпадает.
#define HOLDING_DELAY 300
new gPreviousKeyTime[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
new current_time = GetTickCount();
if (current_time >= gPreviousKeyTime[playerid] + HOLDING_DELAY) {
new keys, updown, leftright;
GetPlayerKeys(playerid, keys, updown, leftright);
if (keys & (KEY_HANDBRAKE | KEY_FIRE)) {
SendClientMessage(playerid, -1, "HOLDING");
}
gPreviousKeyTime[playerid] = current_time;
}
return 1;
}
Лишь нажатие опять палит, но не зажатие...
Реагирует лишь на зажатие KEY_FIRE
vovandolg
30.07.2016, 19:36
Беру пример с Wiki,
new pKeyPress[MAX_PLAYERS];
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (PRESSED(KEY_ACTION)) //так же и для своих клавиш подставь просто
{
pKeyPress[playerid] = 1;
}
else if (RELEASED(KEY_ACTION)) //так же и для своих клавиш подставь просто
{
pKeyPress[playerid] = 0;
}
return 1;
}
//где то на просторах апдейта
public UpdateTimer(playerid)
{
if (pKeyPress[playerid] == 1)
{
print("ты KEY_ACTION зажал");
}
}
Edward Morra
30.07.2016, 20:19
Беру пример с Wiki,
new pKeyPress[MAX_PLAYERS];
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (PRESSED(KEY_ACTION)) //так же и для своих клавиш подставь просто
{
pKeyPress[playerid] = 1;
}
else if (RELEASED(KEY_ACTION)) //так же и для своих клавиш подставь просто
{
pKeyPress[playerid] = 0;
}
return 1;
}
//где то на просторах апдейта
public UpdateTimer(playerid)
{
if (pKeyPress[playerid] == 1)
{
print("ты KEY_ACTION зажал");
}
}
Там для одной.
Пытался также для двух сделать - опять же либо левую зажимаешь проходит, а когда левую и правую то нет....
vovandolg
30.07.2016, 22:35
if (PRESSED(KEY_HANDBRAKE | KEY_FIRE))
{
pKeyPress[playerid] = 1;
}
else if (RELEASED(KEY_FIRE | KEY_HANDBRAKE))
{
pKeyPress[playerid] = 0;
}
:smoke: пытался он...
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot