• 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[GUIA] Uso Enum
#1
Es com?n ver en ciertos scripts o partes de c?digo que se publican en foros, gente que no utiliza el Enum, o que lo utiliza mal, ya sea por ignorancia o porque jamas se lo han explicado bien.
Por eso traigo esta peque?a guia que deberia explicar de manera rapida y simple que es un Enum, y como se usa.

Enumeraciones.


Las enumeraciones son un sistema muy ?til para representar largos grupos de datos, y modificarlos de manera simple y r?pida. Se pueden utilizar para reemplazar grandes grupos de constantes definidas o para crear nuevos "tags".

Sin embargo, el uso mas com?n y el que se vera en esta gu?a, es para representar espacios en un array/vector de datos.

Definiendo un Enum

Comencemos con algo muy normal, variables para un usuario. Comensemos por crear un Enumerador, llamado "InfoJugador", con cada tipo de dato que queremos guardar sobre un jugador.


PHP Code:
enum InfoJugador {
?? ?
idUsuario,
?? ?
Bool:estaLogeado,
?? ?
dinero,
?? ?
drogas,
?? ?
skin,
?? ?
rango,
?? ?
banco,
?? ?
aceptaPM,
?? ?
vehiculo,
?? ?
Float:velocidad,
?? ?
Float:altura,
?? ?
fps,
?? ?
clanID,
?? ?
asesinatos,
?? ?
muertes


...Obviamente, un servidor real tendra muchas mas variables de jugador que estas, pero como ejemplo, va a servir. Pueden ver que dentro del enum definimos varios diferentes tipos de datos, en este caso Integer, Float y un Booleano. Tranquilamente podriamos tener string y cualquier tipo mas si quisieramos, ya que al hacer enums los contenidos de un arreglo no estan limitados a un solo tipo de dato, pero por ahora, con estos nos alcanzara.

Utilizando un Enum

Para utilizar ese enumerador, simplemente tenemos que definirlo dentro de un arreglo. En este caso, vamos a crear un arreglo de dos dimensiones que contendra toda la informaci?n para cada jugador.

PHP Code:
new Jugador[MAX_PLAYERS][InfoJugador]; 

Pueden ver que la primera dimensi?n de nuestro arreglo es la cantidad de espacios/slots que tiene el servidor o "MAX_PLAYERS", mientras la segunda dimensi?n es el Enum que creamos anteriormente. De esta manera se le asigna a cada playerid, cada una de las variables que colocamos en el Enumerador.

Ahora acceder a una variable de usuario es tan simple como utilizar Jugador[playerid][NombreElemento], donde NombreElemento es cualquiera de los elementos definidos dentro del Enum.

Ya se puede ver una de las principales ventajas que tiene sobre crear cada variable de manera individual (ejemplo "dinero[playerid];"), siendo esta que ahora se tiene una manera estandarizada de agregar y acceder a cada valor.

Inicializando un Enum

Cuando el servidor inicia, y cada vez que un nuevo jugador se conecta, obviamente no vamos a querer que tengan datos basura o datos del jugador que anteriormente tenia la misma ID. Para esto es necesario inicializar el Enumerador con datos por defecto.

PHP Code:
InicializarJugador(playerid) {
?? ?
Jugador[playerid][idUsuario] = -1;
?? ?
Jugador[playerid][estaLogeado] = false
?? ?Jugador[playerid][dinero] = 0;
?? ?
Jugador[playerid][drogas] = 0;
?? ?
Jugador[playerid][skin] = 0;
?? ?
Jugador[playerid][rango] = 0;
?? ?
Jugador[playerid][banco] = 0;
?? ?
Jugador[playerid][aceptaPM] = 1;
?? ?
Jugador[playerid][vehiculo] = -1;
?? ?
Jugador[playerid][velocidad] = 0.0;
?? ?
Jugador[playerid][altura] = 0.0;
?? ?
Jugador[playerid][fps] = -1;
?? ?
Jugador[playerid][clanID] = -1;
?? ?
Jugador[playerid][asesinatos] = 0;
?? ?
Jugador[playerid][muertes] = 0;


Si bien en esta situaci?n se podria utilizar un iterador que recorra todos los elementos de InfoJugador, no es recomendable ya que claramente no todos los espacios tendran el mismo valor de inicio.

Obviamente, varios de esos datos van a ser cambiados por tu sistema de usuario cada vez que un usuario se Logee o Registre, pero es ideal de todas maneras tener un estado limpio para evitar problemas. La funci?n de arriba, InicializarJugador(), deberia idealmente ejecutarse sobre cada jugador que se conecte en OnPlayerConnect() .

IMPORTANTE: Tener en cuenta que las variables van a seguir existiendo una vez que un jugador se conecte y no se conecta otro para reemplazar su ID. Si tienen iteradores de MAX_PLAYERS, no solo chequeen que esten logeados en el sistema de usuario, tambien chequeen IsPlayerConnected(playerid) !!

Conclusi?n

Utilizar Enumeradores es una manera muy rapida y sensilla de almacenar y organizar grupos de datos para ciertas cosas dadas, como pueden ser jugadores, casas y negocios entre muchas otras cosas. Provee una manera estandarizada de acceder y definir datos, al mismo tiempo que ayuda a separar variables relacionadas a ciertos componentes del servidor de otras.

Es importante aclarar, por supuesto, esta no es la "manera correcta" de guardar variables de usuario/casa/etc. No existe tal cosa como la manera correcta y suprema.
Existen muchas maneras y cada una es mejor dependiendo de como escribas y organizes tu GM. Aqui yo solo les muestro una m?s.

Espero les haya sido de ayuda.
  Reply
#2
M?s que una gu?a, buena aplicaci?n. Esto me hizo recordar a las estructuras de datos heterog?neas?que se maneja en lenguaje C.

?Buena gu?a!
  Reply
#3
Excelente gu?a, despejar? la dudas de algunos.
  Reply
#4
Est? bien, por dem?s de b?sico. Un uso m?s avanzado del enum se ense?a en el siguiente tutorial: https://forums.alliedmods.net/showthread.php?t=140103
  Reply
#5
?Muy buena Markski! Esto le servir? a muchos iniciando en Pawn.
Languajes de Programaci?n que domino:

Pawn, Lua.

Lenguajes de Programaci?n que estoy aprendiendo:

C, JavaScript & C#.



?Listo para ayudarte!

  Reply


Forum Jump: