PDA

Просмотр полной версии : [Вопрос] Как отловить одновременное зажатие двух клавиш?



Edward Morra
29.07.2016, 17:40
Сижу битый день и не могу понять смысл своей рукожопности.
Я никак не могу отследить в OnPlayerKeyStateChange зажатие KEY_FIRE и KEY_HANDBRAKE одновременно.
Т.е я требую от системы не просто пропустить при зажатии, а циклично для системы чтобы игрок мог тушить.

HarrWe
29.07.2016, 18:38
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).

HarrWe
29.07.2016, 18:42
А не так понял вопроса. Извиняюсь.

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("Вывожу данные при нажатии ПКМ + ЛКМ");
}
У меня всё работает вот так, попробуйте в начало паблика поставить такой код

Хорошо, зажми теперь их и посмотри. Если консоль зафлудит то твой метод работает, если же там будет мало записей то он реагирует лишь на количество нажатий , а не на зажатие.

ziggi
29.07.2016, 19:02
Твоя острота по использовании 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 отпадает...
Просто юзер не определился и не написал точно что он хочет чтобы клавиши при нажатии выводили или при зажатии...
Я дал рабочий пример на нажатие кнопок, но если порыскать по ссылке которую я дал можно сделать и на зажатие

ziggi
29.07.2016, 19:46
Ему мышку надо проверить, а не клавиатуру, 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;
}

DeimoS
29.07.2016, 19:54
Используя макрос, что имеется в 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: пытался он...