Guide e Tutorials:indexed | ||||||
Visual Basic e DirectX8 (Seconda parte) Come già visto nelle lezioni precedenti, i requisiti fondamentali per poter interagire con DirectX sono due: avere installato una versione qualsiasi di DirectX (tenendo conto nel progetto della versione a disposizione) ed aver precedentemente caricato la libreria DirectX per Visual Basic disponibile nella finestra di dialogo Riferimenti. Per una maggiore comprensione, la finestra si apre cliccando sulla voce Progetto del menu principale e selezionando dal menu Progetto che si aprirà, la voce Riferimenti che è quella accompagnata dall'icona dei libri. Basterà poi selezionare la voce DirectX 8.0 for Visual Basic Type Library per poter utilizzare tutti gli oggetti di cui la libreria in questione si compone. Gran parte delle applicazioni che usano le DirectX sono dotate di una modalità di visualizzazione a tutto schermo: risulterebbe infatti piuttosto scomodo dover ridurre il campo di lavoro per lasciare spazio alla barra delle applicazioni ed alla barra del titolo. Anche nel progetto sviluppato nell'articolo precedente si aggiungerà tale modalità. Il passo da compiere immediatamente è quello di permettere all'applicazione di chiudersi. Questo perchè non essendoci più controlli e pulsanti di chiusura nella modalità a tutto schermo, si rischia di dover riavviare il computer per terminare l'applicazione. Dovrà essere aggiunto allora il seguente codice al listato:
Questo permette di terminare l'applicazione cliccando col mouse su un qualsiasi punto dello schermo, proprio perchè la form in questa modalità di visualizzazione ha le stesse dimensioni dello schermo intero. Il passo decisivo per compiere l'operazione in esame è costituito dall'assegnazione di valori alle variabili Visualizzazione (del tipo D3DDISPLAYMODE che cioè racchiude le informazioni sulle modalità di visualizzazione delle immagini) e D3DWindow (del tipo D3DPRESENT_PARAMETERS contiene i parametri di visualizzazione della finestra di esecuzione dell'applicazione). Ed in particolare questo tipo di operazione dovrà essere compiuta all'interno della funzione Inizializza(), vedremo tra poco in quale punto esatto:
Vediamo di analizzare il blocco di codice. Le linee dalla seconda alla quarta assegnano il formato all'immagine. Nella memoria nella quale sono archiviate infatti le immagini hanno un formato che può essere scelto e modificato a piacimento. E si parla di formato non solo riguardo alla dimensione delle stesse (attraverso le linee tre e quattro infatti si è impostata la dimensione delle immagini su una grandezza di 640 pixel in larghezza e 480 in altezza, che come si vedrà, corrisponde proprio alle dimensioni dello schermo intero) ma anche riguardo alla loro definizione. Il grado di definizione permette di indicare quanti bit di memoria sono richiesti per visualizzare ogni singolo pixel di un'immagine. Nel precedente articolo abbiamo già visto quali costanti possono essere assegnate alla variabile. In questo caso la costante D3DFMT_X8R8G8B8 indica che ogni pixel sarà visualizzato attraverso 32 bit utilizzando un sistema di colori ARGB dove cioè si considera oltre la combinazione rosso, blu e verde, anche la trasparenza della figura. La settima linea invece determina la procedura di visualizzazione delle immagini. Indicando la costante D3DSWAPEFFECT_FLIP Direct3D si considerano tutte le partizioni della memoria che contengono le immagini ossia i backbuffer dove le immagini vengono archiviate in attesa di essere visualizzate sullo schermo ossia nel frontbuffer. Si viene così a formare una sequenza per la quale ad ogni buffer viene assegnato un determinato indice da 0 ad n-1 (dove n corrisponde al totale dei buffer presenti e 0 corrisponde al buffer che conteneva l'immagine visualizzata meno di recente): Nell'esempio in figura i buffer totali sono 3. Quindi n assumerà il valore 3. L'ultimo buffer avrà dunque indice n - 1 = 3 - 1 = 2, il secondo n - 2 = 3 - 2 = 1 ed il primo, cioè quello in attesa di essere visualizzato n - 3 = 3 - 3 = 0. Questo sistema di rotazione servirà nella visualizzazione delle immagini al richiamo del metodo Present dell'oggetto Direct3DDevice8 in modo tale che il FrontBuffer che contiene l'immagine correntemente mostrata diventi l'ultimo backbuffer (indice n-1) ed il backbuffer che aveva indice 0 adesso diventi il frontbuffer: Sfortunatamente però questo sistema di rotazione dei buffer può implicare un uso della memoria al di sopra delle capacità del processore. Ecco perchè è possibile indicare una seconda costante ossia D3DSWAPEFFECT_DISCARD che utilizza una sequenza molto simile a D3DSWAPEFFECT_FLIP ma che elimina il buffer una volta visualizzata l'immagine. Questo non permette di determinare il contenuto dei buffer una volta visualizzati dal momento che vengono via via svuotati. Molto più immediata è invece la sequenza creata dalle costanti D3DSWAPEFFECT_COPY e D3DSWAPEFFECT_COPY_VSYNC con le quali viene utilizzato solamente un backbuffer il cui contenuto viene visualizzato immediatamente nel frontbuffer. Ritornando al codice, l'ottava riga indica il numero di backbuffer presenti, cioè uno che è il minimo per poter eseguire correttamente l'applicazione. Le linee nove, dieci e undici non fanno altro che impostare le dimensioni delle immagini dei backbuffer con le quali verranno poi visualizzate sullo schermo e la definizione delle stesse in termini di bit per pixel. Notare che se la modalità è a tutto schermo le dimensioni delle immagini devono coincidere con quelle dello schermo. La penultima riga infine determina a quale form applicare la visualizzazione a tutto schermo. Il codice sopra va inserito nella funzione Inizializza() in modo che adesso appaia nel seguente modo:
Se il codice funziona come dovrebbe, si visualizzerà l'applicazione a tutto schermo come mostrato in figura: Se nella routine Form_Load si cambia invece il colore di fondo della form si otterrà uno schermo del colore scelto. E' inoltre possibile inserire controlli a piacimento gestendoli come si farebbe normalmente con l'unica accortezza di estendere al massimo il piano in fase di progettazione per adattare le dimensioni della form allo schermo intero. In questo modo quando si andranno a posizionare i controlli si potrà avere un'idea migliore delle proporzioni finali. Infine è buona norma svuotare alla chiusura dell'applicazione quella porzione di memoria utilizzata dai vari oggetti (DirectX8, Direct3D8, Direct3DDevice8 e tutti gli altri eventualmente presenti nel progetto). Nella routine Form_Unload() si dovrà inserire quindi il seguente codice:
|
Archivio:ndexed | ||||
Lezioni | Commenta questa lezione | Invia la tua guida | Avviso per le nuove lezioni | Proponi un argomento |
Visual Basic Italia© copyright 2000 - tutti i diritti riservati |