Burgershot
  • Home
  • Members
  • Team
  • Help
  • Search
  • Register
  • Login
  • Home
  • Members
  • Help
  • Search
Burgershot Other languages Spanish/Español Programación [GUIA] Uso Enum

 
  • 1 Vote(s) - 5 Average
[GUIA] Uso Enum
Markski
Offline

Burgershot Clerk

Posts: 127
Threads: 6
Joined: Apr 2019
Reputation: 5
Location: La Plata, Argentina
#1
2019-04-16, 03:59 PM (This post was last modified: 2019-04-16, 04:04 PM by Markski.)
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.
Website
MrDave1999
Offline

Burgershot Member
Posts: 1
Threads: 0
Joined: Apr 2019
Reputation: 0
#2
2019-04-16, 04:16 PM (This post was last modified: 2019-04-16, 04:17 PM by MrDave1999.)
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!
Botato
Offline

Programador | Mapper
Posts: 66
Threads: 0
Joined: Apr 2019
Reputation: 1
Location: Argentina
#3
2019-04-16, 08:18 PM
Excelente guía, despejará la dudas de algunos.
Autorojo
Offline

Burgershot Member
Posts: 9
Threads: 0
Joined: Apr 2019
Reputation: 0
#4
2019-04-19, 12:38 PM
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
SKainer
Offline

Burgershot Member
Posts: 15
Threads: 3
Joined: Jan 2020
Reputation: 0
#5
2020-02-23, 08:02 PM
¡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!
« Next Oldest | Next Newest »



  • View a Printable Version
  • Subscribe to this thread
Forum Jump:

© Burgershot - Powered by our Community and MyBB Original Theme by Emerald

Linear Mode
Threaded Mode