Salve a tutti.
Mi sto cimentando con le DirectX9 e ora sono arrivato un po ad usare le Surface, caricare immagini e visualizzarle sullo schermo.
Non ho avuto problemi a creare un sottofondo in Dx alla mia finestra. Ma se voglio prendere solo una parte di immagine, so che devo usare i RECT per di sorgente e destinazione. Qui sorgono trecentomila problemi. Vi illustro un po la situazione.
Io ho la mia funzione render
void Render(void);
la quale viene richiamata ogni volta che la finestra deve essere ridisegnata. La funzione Render è cosi strutturata
codice:
void Render()
{
IDirect3DSurface9* BackBuffer = NULL;
IDirect3DSurface9* SpriteSurface = NULL;
//BackBuffer è la surface di destinazione
//SpriteSurfaec è quella sorgente
SpriteSurface = CaricaSprite( "Quadratino.bmp" );
if (SpriteSurface == NULL)
return;
//Questa funzione carica lo sprite nella memoria e //restituisce un puntatore alla surface caricata
if( NULL == g_pd3dDevice )
return;
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&BackBuffer);
RECT Prova;
RECT DestProva;
Prova.bottom = 4;
Prova.left = 17;
Prova.right = 21;
Prova.top = 41;
DestProva.bottom = 50;
DestProva.left = 50;
DestProva.right = 50;
DestProva.top = 50;
//Qui sorgono i problemi (leggete sotto)
g_pd3dDevice->StretchRect(SpriteSurface,&Prova,BackBuffer,&DestProva,D3DTEXF_NONE);
//Disegna sullo schermo
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
Spero che il codice sia chiaro.
Ad ogni modo quoto la parte dei probemi
RECT Prova;
RECT DestProva;
Prova.bottom = 4;
Prova.left = 17;
Prova.right = 21;
Prova.top = 41;
DestProva.bottom = 50;
DestProva.left = 50;
DestProva.right = 50;
DestProva.top = 50;
In pratica creo due RECT che verranno quindi passati alla funzione del disegno.
Essendo la mia immagine grande 48x48, i valori di Prova non pssono superare il valore 48.
I Dubbio: Un rettangolo è un parallelogramma che ha i lati paralleli a due a due: quindi left dovrebbe essere sempre uguale a right. E' quindi evidente che RECT non è altro che un nome semplice: in realtà ciò che prende il pezzo di immagine è un quadrilatero semplice,vero?
Comunque, il Rect prova dovrebbe essere giusto...
Passiamo ora al DestProva: essendo in questo caso il mio schermo grande 640x480, i vari valori non devono superare 640 e 480,giusto?
Come vedete i valori sono tutti a 50, eppure mi da Invalid Dest Rect!!! E' stranissimo! Cosi io comincio a variare i valori di DestProva e mi ritrovo con un errore del Source Rect...cio è una volta Dest e una volta il Src rect? Ma quale è quello sbagliato?
II Dubbio: l'immagine è 48x48: quindi se io col DestProva (ammesso che funzionasse) prende un rettangolo maggiore dell'immagine: l'immagine verrà quindi ingrandita alle dimensioni del rettangolo?
Grazie mille per l'aiuto!