|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 02.07.2003, 15:23 Titel: Surface Bild ändern |
|
|
Also...
Ich habe wie im Buch eine Surface geladen:
Code: | void InitBack(char Path[200])
{
DDCOLORKEY ColorKey;
HDC ScrDC;
HDC hBmpDC;
ZeroMemory(&S_Lvl_Back,sizeof(S_Lvl_Back));
S_Lvl_Back.dwSize=sizeof(S_Lvl_Back);
S_Lvl_Back.dwFlags=DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
S_Lvl_Back.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
S_Lvl_Back.dwWidth=800;
S_Lvl_Back.dwHeight=500;
if (FAILED(lpDD7->CreateSurface(&S_Lvl_Back,&lpDD_Lvl_Back,NULL)))
{
MessageBox(0,"5 Fehler beim Anlegen der Spieleroberfläche!","Fehler",MB_OK);
}
ColorKey.dwColorSpaceLowValue=RGB(0,255,0);
ColorKey.dwColorSpaceHighValue=RGB(0,128,0);
lpDD_Lvl_Back->SetColorKey(DDCKEY_SRCBLT,&ColorKey);
HBITMAP hDataBit=(HBITMAP)LoadImage(NULL,Path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
lpDD_Lvl_Back->GetDC(&ScrDC);
hBmpDC=CreateCompatibleDC(ScrDC);
SelectObject(hBmpDC,hDataBit);
BitBlt(ScrDC,0,0,800,500,hBmpDC,0,0,SRCCOPY);
lpDD_Lvl_Back->ReleaseDC(ScrDC);
DeleteDC(hBmpDC);
DeleteObject(hDataBit);
} |
So und nun will ich aber in die selbe Surface (Lvl_Graph) ein ganz anderes Bild laden... Wie kann ich das machen??? |
|
Nach oben |
|
|
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 02.07.2003, 15:54 Titel: |
|
|
ich weis nich ob's funzt aber ich denke, das es gehen müste wenn du an den anfang deiner funktion das hier setzt:
if(NULL != lpDD_Lvl_Back)
{
lpDD_Lvl_Back->Release();
lpDD_Lvl_Back= NULL;
}
das bedeutet soviel wie:
wenn die surface schon beschrieben ist(ein bild wurde reingeladen usw. ...), dann wird diese Release't und dann der wert NULL zugeteilt. aber beachte das: DIESER IF-BLOCK AM ANFANG DEINER FUNKTION STEHEN MUS!!!
müste eigentlich gehen. |
|
Nach oben |
|
|
Mäscht JLI'ler
Anmeldedatum: 22.05.2003 Beiträge: 150 Wohnort: Bad Hofgastein\Österreich Medaillen: Keine
|
Verfasst am: 03.07.2003, 06:25 Titel: |
|
|
das mit ->Release() kannst du dir sparen!! gib einfach deiner Oberfläche einen neuen wert z.B: lpDDSurface = CreateSurfaceFromBitmap("Test.bmp",654,564);"
Das dürfte gehen! Ist bei mir auch gegangen! _________________ Motz´z mi net o, i bin ofänga!! AEIOU für immer |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 03.07.2003, 08:02 Titel: |
|
|
Mäscht hat Folgendes geschrieben: | das mit ->Release() kannst du dir sparen!! gib einfach deiner Oberfläche einen neuen wert z.B: lpDDSurface = CreateSurfaceFromBitmap("Test.bmp",654,564);"
Das dürfte gehen! Ist bei mir auch gegangen! |
Tut mir Leid, aber nigs hat Recht. Mäscht erzeugt einen Memory Leak und verschwendet Speicher auf der Grafikkarte. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 03.07.2003, 08:05 Titel: |
|
|
Schreib eine neue Funktion, der Du den Surface-Pointer + den neuen Bild-Dateinamen übergibst.
In dieser Funktion brauchst Du lediglich den unteren Teil Deiner oben geposteten Funktion! (Warum sollte man auch die Surface neu initialisieren, wenn bei Dir alle Bilder 800x500 groß sind,laut Deiner fest vergebenen Größe in obiger Funktion)
Also nur diesen Teil:
Code: | //Funktionskopf
{
HBITMAP hDataBit=(HBITMAP)LoadImage(NULL,Path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
lpDD_Lvl_Back->GetDC(&ScrDC);
hBmpDC=CreateCompatibleDC(ScrDC);
SelectObject(hBmpDC,hDataBit);
BitBlt(ScrDC,0,0,800,500,hBmpDC,0,0,SRCCOPY);
lpDD_Lvl_Back->ReleaseDC(ScrDC);
DeleteDC(hBmpDC);
DeleteObject(hDataBit);
} |
Mäscht schrieb:
Zitat: |
das mit ->Release() kannst du dir sparen!! gib einfach deiner Oberfläche einen neuen wert z.B: lpDDSurface = CreateSurfaceFromBitmap("Test.bmp",654,564);"
Das dürfte gehen! Ist bei mir auch gegangen!
|
KÄSE !!!
Natürlich geht das, aber dadurch müllst Du Deinen Graka-Speicher zu mit Surfaces, auf die Du nicht mehr zugreifen kannst!!! Wenn Du einfach einen bereits belegten Pointer neu intialisierst mit'ner Surface, dann ist die "alte" Surface immer noch irgendwo im Speicher und Du kannst irgendwann garkeine Surface mehr erstellen, obwohl Du ja "nur eine" Surface(den Pointer darauf) ANGEBLICH hast.
[EDIT] Hazel war schneller [/EDIT] |
|
Nach oben |
|
|
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 05.07.2003, 11:52 Titel: |
|
|
Danke...
Mit der Variante von MrX läufts... |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|