27-05-2012, 07:04 PM
(Questo messaggio è stato modificato l'ultima volta il: 27-05-2012, 07:08 PM da steve.)
Gli enum sono una serie di costanti (definite manualmente o automaticamente) raggruppate in un tipo (definito da te). Un esempio pratico di enum è la gestione dei tasti in una libreria che gestisce l'input asincrono (per i videogiochi, ad esempio). Ti faccio proprio un esempio pratico di come si utilizza la libreria OIS:
In questo modo, per verificare se è stato premuto un tasto, non devi ricordarti il numero a cui corrisponde.
Un altro esempio potrebbe essere la gestione di un personaggio in un platform:
Come puoi capire, se al posto dell'enum avessi usato delle costanti non sarebbe cambiato niente, ad esempio:
Tuttavia usare i "magic numbers" (numeri che hanno implicitamente un altro significato) è male: oggi ti ricordi che 1 significa "salta", ma tra un mese te lo sarai dimenticato.
EDIT:
Mi rendo conto di essermi spiegato un po' alla caxxo, se continui a non capire avvisa che cerco un esempio migliore.
Codice:
if(pKeyboard->isKeyDown(OIS::KC_ESCAPE)) // OIS è un enum, KC_ESCAPE è una costante enumerativa
{
// è stato premuto esc
}
Un altro esempio potrebbe essere la gestione di un personaggio in un platform:
Codice:
enum statoPersonaggio
{
VAI_AVANTI,
VAI_INDIETRO,
SALTA,
SPARA
};
bool controllaTasti(/*...*/)
{
statoPersonaggio statoAttuale; //variabile di tipo stato, che può assumero solo i valori nell'enum stato
if(/* è stato premuto lo spazio */)
{
statoAttuale = statoPersonaggio::SALTA;
}
if(/* è stato premuto la freccia destra */)
{
statoAttuale = statoPersonaggio::VAI_AVANTI;
}
// ecc....
controllaPG(statoAttuale); // può assumere solo i valori dell'enum "stato"
}
void controllaPG(statoPersonaggio s)
{
if(s == statoPersonaggio::VAI_AVANTI)
{
// codice che mi muove in avanti il personaggio
}
//ecc...
}
Come puoi capire, se al posto dell'enum avessi usato delle costanti non sarebbe cambiato niente, ad esempio:
Codice:
bool keyPressed(const OIS::KeyEvent &keyEventRef)
{
int statoAttuale;
if(m_pKeyboard->isKeyDown(OIS::KC_SPACE))
{
statoAttuale = 1; // mi ricordo che 1 corrisponde a "salta"
}
if(m_pKeyboard->isKeyDown(OIS::KC_W))
{
statoAttuale =2; // mi ricordo che 2 corrispone a "vai avanti"
}
...
controllaPG(statoAttuale);
}
void controllaPG(int s)
{
if(s == 1) // 1 corrispondeva a "salta"
{
// codice che mi fa saltare il personaggio
}
...
}
Tuttavia usare i "magic numbers" (numeri che hanno implicitamente un altro significato) è male: oggi ti ricordi che 1 significa "salta", ma tra un mese te lo sarai dimenticato.
EDIT:
Mi rendo conto di essermi spiegato un po' alla caxxo, se continui a non capire avvisa che cerco un esempio migliore.