OnPlayerKeyStateChange ES
From SA-MP Wiki
Description:
playerid | ID del jugador cuya tecla cambio de estado. |
newkeys | Espectro del estado actual de las teclas. Ver GetPlayerKeys. |
oldkeys | Espectro del estado anterior de las teclas. Ver GetPlayerKeys. |
Return Values:
Explicación Detallada
Introducción
Este callback es llamado cuando un jugador presiona, suelta o mantiene presionada una de las teclas, se puede observar claramente que detecta las teclas por la funcion que cumplen, y no por la tecla en si.
Como NO chequear una tecla
Ejemplo: '(se supone que la tecla a detectar es la tecla de disparar.)'
if (newkeys == KEY_FIRE)
El codigo anteriormente dado, puede que funcione, pero esta incompleto y puede no funcionar. ¿Por qué? Simple, ese codigo funcionara si la unica tecla presionada es la tecla de disparar, si en el mismo momento se presiona ademas de la tecla de disparar, ese codigo dejara de funcionar.
Como chequear una tecla
Entonces si tenemos una variable que contiene multiples teclas, como sabemos si hay o no una tecla presionada? Para realizar dicha comparacion, usaremos un metodo denominado bit masking (no se como se traduciria al español). Cada tecla tiene su propio bit en la variable (algunas teclas tienen elk mismo bit, pero se dividen en (a pie/en auto), por lo que nunca pueden ser presionadas al mismo tiempo.
if (newkeys & KEY_FIRE)
Tengan en cuenta que "&" es un "Y" pero a nivel de bits, no logico ("&&").
Como chequear si una tecla esta fue presionada y luego liberada
Aca es donde entra "oldkeys". Para chequear si una tecla fue presionada, primero necesitamos saber si esta su valor en "newkeys", lo que significa que esta siendo presionada, luego necesitamos chequear que no este dentro de "oldkeys", lo que significara que no fue presionada la vez anterior que se llamo este callback.
if ((newkeys & KEY_FIRE) && !(oldkeys & KEY_FIRE))
Como chequear si una tecla fue liberada
Es exactamente = que chequear si una tecla fue presionada, solo que al reves.
if ((oldkeys & KEY_FIRE) && !(newkeys & KEY_FIRE))
Como chequear si una tecla esta siendo presionada
El valor de la tecla debera estar tanto en "newkeys", como en "oldkeys", quedando de la siguiente forma:
if ((newkeys & KEY_FIRE) && (oldkeys & KEY_FIRE))
Como chequear para multiples teclas
Para chequear si varias teclas estan siendo presionadas, el codigo seria el siguiente:
if ((newkeys & KEY_FIRE) && (newkeys & KEY_CROUCH))
Metodos abreviados
Detectando si una tecla esta siendo presionada
// HOLDING(keys) #define HOLDING(%0) \ ((newkeys & (%0)) == (%0))
Ejemplo:(una sola tecla)
if(HOLDING(KEY_FIRE))
Ejemplo:(multiples teclas)
if(HOLDING(KEY_FIRE | KEY_CROUCH))
Detectando si una tecla fue presionada y luego liberada
// PRESSED(keys) #define PRESSED(%0) \ (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
Ejemplo:(una sola tecla)
if(PRESSED(KEY_FIRE))
Ejemplo:(multiples teclas)
if(PRESSED(KEY_FIRE | KEY_CROUCH))
Detectando la liberacion de una tecla
// RELEASED(keys) #define RELEASED(%0) \ (((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
Ejemplo:(una sola tecla)
if(RELEASED(KEY_FIRE))
Ejemplo:(multiples teclas)
if(RELEASED(KEY_FIRE | KEY_CROUCH))
Ejemplos:(funcionales)
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(PRESSED(KEY_FIRE) && IsPlayerInAnyVehicle(playerid)) //si el jugador presiona la tecla de disparo, y esta en un vehiculo, agregamos nitro a su vehiculo. AddVehicleComponent(GetPlayerVehicleID(playerid), 1010); return 1; }
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(PRESSED(KEY_ACTION)) //Si el jugador presiona la tecla de accion, lo curamos SetPlayerHealth(playerid, 100.0); return 1; }
Funciones relacionadas
Las siguientes funciones pueden ser útiles, ya que éstas están relacionadas con esta función de alguna u otra manera.
- GetPlayerKeys Retorna las teclas que el jugador esta presionando.
Callbacks relacionadas
Las siguientes callbacks pueden ser útiles, ya que éstas están relacionadas con esta función de alguna u otra manera.
- OnPlayerStateChange Llamado cuando el estado del jugador cambia.