OnPlayerKeyStateChange ES

From SA-MP Wiki

Jump to: navigation, search



Description:

Este callback es llamado cuando el estado de cualquier tecla (excepto teclas de movimiento) cambia.


Parámetros:
(playerid, newkeys, oldkeys)
playeridID del jugador cuya tecla cambio de estado.
newkeysEspectro del estado actual de las teclas. Ver GetPlayerKeys.
oldkeysEspectro del estado anterior de las teclas. Ver GetPlayerKeys.


Return Values:

1 Le permite a este callback ser llamado en otros scripts. Siempre es llamado 1º en el gamemode, por lo que retornar 0 evitara que el mismo sea llamado en los demas scripts.


Contents

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.

Personal tools
Navigation
Toolbox
In other languages