OpenGL è una macchina a stati. Essa viene impostata
in vari stati o modi di funzionamento e resta in quello stato sino a
quando non viene modificato. Come si è già visto, il colore
corrente è una variabile di stato. Si può impostare il colore
corrente in bianco, rosso, e qualsiasi altro colore, quindi ogni
oggetto sarà disegnato in quel colore, sino a quando il colore
impostato non verrà cambiato. Altri controllano cose quali
l'impostazione della vista attuale, e le trasformazioni della
proiezione ortogonale, le trame di linee e poligoni, il modo di
disegnare i poligoni, i metodi per impacchettare i pixel, e le
posizioni e caratteristiche delle luci, le proprietà dei materiali
degli oggetti disegnati. Molti di queste variabili di stato hanno
modalità che possono attivate o disattivate mediante i comandi
glEnable() o glDisable(). Ogni variabile di stato ha
una modalità di default, e in ogni punto del programma si può
chiedere al sistema il valore corrente. Tipicamente, vengono usati
uno dei seguenti 6 comandi per conoscerlo: glGetBooleanv(),
glGetDoublev(), glGetInteger(),glGetPointer(), glIsEnabled(). La
selezione di alcuni di questi comandi dipende dal tipo di dato da
recuperare. Alcune variabili di stato possiedono comandi specifici
(quali glGetLight*(), glGetError() o glGetPolygonStipple().
Inoltre si possono salvare un insieme di variabili di stato su uno
stack di attributi, mediante glPushAttrib() o
glPushClientAttrib()
temporaneamente. Dopo averle modificate, sono recuperate mediante le
istruzioni glPopAttrib(), glPopClientAttrib().
Per cambiamenti di stato temporanei è consigliato utilizzare queste
ultime istruzioni, in quanto sono più efficienti.
In questo blog si parla di programmazione con il linguaggio C++, i post cercheranno di essere molto esplicativi sull'argomento trattato.
Visualizzazione post con etichetta memoria dinamica. Mostra tutti i post
Visualizzazione post con etichetta memoria dinamica. Mostra tutti i post
lunedì 28 gennaio 2013
mercoledì 12 dicembre 2012
La classe SalaGioco
La classe SalaGioco
rappresenta la sala o la fila nella quale i giocatori attendono.
Class
SalaGioco
{
friend ostream& operator<<(ostram& os, const SalaGioco&
aSalaGioco);
public:
SalaGioco():
m_pTesta(0){}
~SalaGioco(
){ Azzera(); }
void
AggiungiGiocatore();
void
RimuoviGiocatore();
void
Azzera();
private:
Giocatore*
m_pTesta;
};
Il membro dati
m_pTesta è un
puntatore che indica l'oggetto Giocatore,
il quale rappresenta la prima persona nella coda. m_pTesta
è l'inizio della coda. Poiché ogni oggetto Giocatore ha
un membro dati m_pPros,
è possibile collegare un gruppo di oggetti Giocatore
in una lista collegata.
Elementi individuali della lista collegata sono chiamati nodi.
Un modo di pensare ai nodi del giocatore è come un gruppo di vagoni
connessi tra loro. Ogni vagone porta un nome e sono collegati
attraverso un puntatore chiamato m_pPros.
La classe SalaGioco
alloca la memoria su heap
per ciascuno dei giocatori sulla lista. La classe SalaGioco fornisce
accesso al primo oggetto Giocatore
in testa alla lista. Il costruttore è molto semplice e inizializza i
dati membro di m_pTesta a 0, con un puntatore nullo. Il distruttore
chiama semplicemente Azzera(), il quale rimuove tutti i giocatori
dalla lista e libera la memoria allocata. AggiungiGiocatore()
istanzia un nuovo oggetto Giocatore
su heap, e lo aggiunge
alla fine della lista. RimuoviGiocatore()
toglie il primo oggetto Giocatore
dalla lista e libera la memoria allocata. Viene dichiarata la
funzione operator<<()
amica di SalaGioco, in
quanto l'oggetto SalaGioco
possa essere visualizzato con cout
usando l'operatore <<.
sabato 8 dicembre 2012
Il programma Sala da Gioco
Il programma sala
da gioco, simula un'area di gioco in attesa di giocatori, solitamente
per un gioco in rete. Il programma non coinvolge alcuna funzione in
linea del computer. Ma crea una singola linea di testo per la quale
il giocatore deve aspettare. L'utente del programma esegue una
simulazione ed ha quattro scelte. Può aggiungere un giocatore alla
sala da gioco, rimuovere una persona dalla sala (la prima ad entrare
è al prima ad uscire), azzerare la sala, o uscire dalla sala da
gioco.
La classe Giocatore
La prima cosa da
fare quando si crea la classe Giocatore e rappresentare i giocatori
che aspettano nella sala da gioco. Poiché non sappiamo quanti
giocatori deve avere la sala ogni volta, ha senso usare una struttura
dinamica. Solitamente, i contenitori utilizzati sono quelli delle
librerie standard, ma in questo caso viene definito un contenitore
dinamico che possa allocare la memoria ed essere gestito dal
programma. Un' ottima via per vedere la memoria dinamica in azione.
//Sala
da Gioco
//Simula
una sala nella quale il giocatore può attendere
#include<iostream>
#include<string>
using
namespace std;
class
Giocatore
{
public:
Giocatore(const
string& nome=” ”): m_Nome(nome), m_pPros(0){}
string
DaiNome() const { return m_Nome;}
Giocatore*
DaiPros() const { return m_pPros;}
void
MettiPros(Giocatore* prossimo){m_pPros = prossimo;}
private:
string
m_Nome;
Giocatore*
m_pPros; //puntatore al giocatore successivo
};
Il membro dati
m_Nome tiene il nome del giocatore. Questo è molto comprensibile, ma
ci si può chiedere quale tipo di dato contenga m_pPros.
E' un puntatore all'oggetto Giocatore,
il quale indica che ogni oggetto Giocatore può contenere il nome e
puntare ad un altro oggetto Giocatore.
Questo è molto comprensibile durante lo sviluppo dell'oggetto
SalaDaGioco. La classe
ha due metodi accessori per m_Nome come due funzioni accessorie dai
e metti per m_pPros.
Il costruttore della classe è molto semplice, inizializza una
stringa m_Nome
basandosi sull'argomento passato ed imposta m_pPros
con un puntatore nullo.
Iscriviti a:
Post (Atom)