Portal SAMP
[Ajuda] Como faço para detectar que foi pressionado ('up, down, right, left') - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Como faço para detectar que foi pressionado ('up, down, right, left') (/showthread.php?tid=2455)



Como faço para detectar que foi pressionado ('up, down, right, left') - Hatiro - 07/06/2022

Quero detectar que a letra 'W' foi pressionada duas vez eu tentei usar OnPlayerKeyStateChange não detecta w,s,a ou d de acordo com o wiki apenas GetPlayerKeys detecta e, ele não tem newkey e oldkey o problema é que ele detecta mesmo se eu estiver segurando as tecla quero apenas quando pressionar alguém sabe como posso fazer? 
Código:
    new Keys, ud, lr;
    GetPlayerKeys(playerid, Keys, ud, lr);
    if (ud == KEY_UP)
    {
        SendClientMessage(playerid, -1, "UP");
    }



RE: Como faço para detectar que foi pressionado ('up, down, right, left') - xbruno1000x - 07/06/2022

É possível detectar o PRESSED com a define abaixo:


Código:
// PRESSED(keys)
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))

Também é possível detectar o HOLDING:


Código:
// HOLDING(keys)
#define HOLDING(%0) \
(newkeys & (%0)) == (%0))

Tudo na OnPlayerKeyStateChange.

Documentação:
https://sampwiki.blast.hk/wiki/OnPlayerKeyStateChange


RE: Como faço para detectar que foi pressionado ('up, down, right, left') - Hatiro - 07/06/2022

(07/06/2022 22:54)xbruno1000x Escreveu: É possível detectar o PRESSED com a define abaixo:


Código:
// PRESSED(keys)
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))

Também é possível detectar o HOLDING:


Código:
// HOLDING(keys)
#define HOLDING(%0) \
(newkeys & (%0)) == (%0))

Tudo na OnPlayerKeyStateChange.

Documentação:
https://sampwiki.blast.hk/wiki/OnPlayerKeyStateChange
Na wiki diz: Directional keys do not trigger OnPlayerKeyStateChange (up/down/left/right). They can only be detected with GetPlayerKeys (in OnPlayerUpdate or a timer).


RE: Como faço para detectar que foi pressionado ('up, down, right, left') - xbruno1000x - 08/06/2022

Bem observado, realmente não me atentei a esse detalhe. O que planeja construir com esse código?


RE: Como faço para detectar que foi pressionado ('up, down, right, left') - Hatiro - 08/06/2022

(08/06/2022 00:06)xbruno1000x Escreveu: Bem observado, realmente não me atentei a esse detalhe. O que planeja construir com esse código?

Era para fazer um dash


RE: Como faço para detectar que foi pressionado ('up, down, right, left') - xbruno1000x - 08/06/2022

Então, acho que talvez seja mais fácil fazer esse sistema com uma junção de dois botões diferentes, como é no caso da include Walking Styles, que permite andar de diferentes estilos pressionando direcionais + ALT.

Trecho exemplificando:
Código:
public OnPlayerUpdate(playerid)
{
    
    #if defined WStyle_OnPlayerUpdate
        WStyle_OnPlayerUpdate(playerid);
    #endif
    if(Player_GetWalkingStyle(playerid) > 0 && Walking_gsTimer[playerid] == -1)
    {
        new keys, updown, leftright;
        GetPlayerKeys(playerid,keys,updown,leftright);
        if (((!!updown  || !!leftright) && (keys & KEY_WALK) ))
        {
            new temp_index_anim = GetPlayerAnimationIndex(playerid);
            for(new i = 0; i < sizeof indexes_animations; i++)
            {
                if(temp_index_anim == indexes_animations[i])
                {  
                    ApplyAnimation(playerid,"PED",NameAnimations[_:Walking_gsStyle[playerid]-1],4.1,1,1,1,1,1);
                    timer_WalkAnimation(playerid);
                    break;
                }
            }
        }        
    }
    return 1;
}

Include completa:
https://raw.githubusercontent.com/Mergevos/samp-walking-styles/master/walking_styles.inc