• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
chiarimento sul c++
#1
il mio libro dice:
le costanti enimerative vengono usate per definire dei nuovi tipi di variabili(...)si può definire il tipo giorno che può assumere i valori:lunedì,martedì,...domenica,nel seguente modo

enum giorno {lunedì,martedì,mercoledì,giovedì,venerdì,sabato,domenica}

nell'esempio precedente il programma disporrà delle seguenti costanti lunedì,martedì...,domenica,i cui valori intrinseci saranno 0,1....6 rispettivamente.E' possibile indicare dei valori diversi nel seguente modo:

enum giorno {lunedì=1 martedì=2....}


poi finisce,non mi ha detto ne l'utilità delle costanti enumeriche e ne a cosa possono servire...me lo dite voi?
 
Rispondi
#2
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:

Codice:
if(pKeyboard->isKeyDown(OIS::KC_ESCAPE)) // OIS è un enum, KC_ESCAPE è una costante enumerativa
{
// è stato premuto esc
}
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:
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.
 
Rispondi
#3
(27-05-2012, 07:04 PM)steve Ha scritto: 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:

Codice:
if(pKeyboard->isKeyDown(OIS::KC_ESCAPE)) // OIS è un enum, KC_ESCAPE è una costante enumerativa
{
// è stato premuto esc
}
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:
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.

oddio grazie *-*
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Inizio nuova serie di tutorial sul C Blackg96 4 1,623 05-06-2014, 10:29 AM
Ultimo messaggio: Blackg96

Vai al forum:


Browsing: 1 Ospite(i)