Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
Visual Basic e DirectX8 (Seconda parte)

Premessa

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:

Private Sub Form_Click()
Unload Me
End Sub

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:

With Visualizzazione
.Format = D3DFMT_X8R8G8B8
.Width = 640
.Height = 480
End With
With D3DWindow
.SwapEffect = D3DSWAPEFFECT_FLIP
.BackBufferCount = 1
.BackBufferFormat = Visualizzazione.Format
.BackBufferHeight = 480
.BackBufferWidth = 640
.hDeviceWindow = Me.hWnd
End With

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:

Private Function Inizializza() As Boolean
Dim Visualizzazione As D3DDISPLAYMODE
Dim D3DWindow As D3DPRESENT_PARAMETERS
Set DX = New DirectX8
Set D3D = DX.Direct3DCreate()
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Visualizzazione
With Visualizzazione
.Format = D3DFMT_X8R8G8B8
.Width = 640
.Height = 480
End With
With D3DWindow
.SwapEffect = D3DSWAPEFFECT_FLIP
.BackBufferCount = 1
.BackBufferFormat = Visualizzazione.Format
.BackBufferHeight = 480
.BackBufferWidth = 640
.hDeviceWindow = Me.hWnd
End With
Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _
Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)
Inizializza = True
Exit Function
Errore:
Inizializza = False
End Function

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:

Private Sub Form_Unload(Cancel As Integer)
Set DX = Nothing
Set D3D = Nothing
Set D3DDevice = Nothing
End Sub



Scarica qui l'esempio completo per questo articolo


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
E-mail:
vbitalia@libero.it