domingo, 14 de octubre de 2012

Tutorial de programación C/C++ desde 0. Capitulo 11


Hola a todos,

En el capitulo 2 de este tutorial  os introduje el tema de los defines.

Si habeís practicado habreis decubierto que los defines son muy poderosos de cara la mantenibilidad del código ya que nos permite definir valores o comportamientos que luego podremos cambiar dejando el código idéntico a como lo teniamos.

En los videojuegos los defines se usan mucho para los estados del juego o de los personajes.

Imaginemos que estamos en el proceso de desarrollo de un RPG en que los personajes pueden tener los siguientes estados:
#define STAND   0
#define ATTACK  1
#define DEATH   2

Si con el tiempo vamos incluyendo nuevas funcionalidades y cambiando las existentes es muy normal que esta lista de defines se alarge hasta el infinito y que estemos constantemente reordenando números cosa que al final genera errores humanos en el código.

Solución??? Enums!!

Los enums los podemos entender como listas de defines autonumerados, es decir que si tenemos lo siguiente (extraido de LP Engine)

// animation list
typedef enum {
STAND,
RUN,
ATTACK,
PAIN_A,
PAIN_B,
PAIN_C,
JUMP,
FLIP,
SALUTE,
FALLBACK,
WAVE,
ANIM_POINT,
CROUCH_STAND,
CROUCH_WALK,
CROUCH_ATTACK,
CROUCH_PAIN,
CROUCH_DEATH,
DEATH_FALLBACK,
DEATH_FALLFORWARD,
DEATH_FALLBACKSLOW,
BOOM,

MAX_ANIMATIONS

} animType_t;

STAND vale 0, RUN vale 1, ATTACK vale 2....



Particularidaes de los enums:

1. Los valores iniciales se pueden fijar:
enum {
STAND = 3,
RUN,
ATTACK,
PAIN_A,
PAIN_B,
PAIN_C,
JUMP,
FLIP,
SALUTE,
}

STAND vale 3, RUN vale 4, ATTACK vale 5,etc..


2. Los enums no son defines , así que con los ejemplos anteriores si hicieramos #ifdef STAND nunca entrariamos por esa condición del precompilador.

"Truco" para saltarse este problema del ifdef:
enum {

STAND,
#define STAND STAND

RUN,
#define RUN RUN

ATTACK,
#define ATTACK ATTACK

PAIN_A,
#define PAIN_A PAIN_A

PAIN_B,
#define PAIN_B PAIN_B

PAIN_C,
#define PAIN_C PAIN_C

JUMP,
#define JUMP JUMP

FLIP,
#define FLIP FLIP

SALUTE,
#define SALUTE SALUTE
}

De esta manera se consigue una lista autcompletada en la que además podemos aplicar #ifdef.


Espero que os haya servido para aprender y os haya gustado.

Para cualquier duda ya lo sabeís.

Nos vemos

LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares