JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=deac2d48a34f4a81f8d26d41e9f96fbdMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Surface Bild ändern

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 02.07.2003, 15:23    Titel: Surface Bild ändern Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nigs
Super JLI'ler



Anmeldedatum: 19.12.2002
Beiträge: 359

Medaillen: Keine

BeitragVerfasst am: 02.07.2003, 15:54    Titel: Antworten mit Zitat

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. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mäscht
JLI'ler



Anmeldedatum: 22.05.2003
Beiträge: 150
Wohnort: Bad Hofgastein\Österreich
Medaillen: Keine

BeitragVerfasst am: 03.07.2003, 06:25    Titel: Antworten mit 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!
_________________
Motz´z mi net o, i bin ofänga!! AEIOU für immer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 03.07.2003, 08:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 03.07.2003, 08:05    Titel: Antworten mit Zitat

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 Wink[/EDIT]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 05.07.2003, 11:52    Titel: Antworten mit Zitat

Danke...

Mit der Variante von MrX läufts...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum