|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DerJJ Junior JLI'ler
Anmeldedatum: 24.12.2002 Beiträge: 84
Medaillen: Keine
|
Verfasst am: 29.03.2003, 14:53 Titel: Problem beim erstellen eines Surface aus Resource |
|
|
Also, wenn ich mein Programm starte kommt kurz ein schwarzer Bildschirm und dann geht das programm wieder aus...
im der Log Datei steht dann:
Zitat: | Fehler beim Laden eines Bildes
Programmfehler, Programm wurde beendet |
Die Funktion zum laden des Bildes:
Code: | LPDIRECTDRAWSURFACE7 CreateSurfaceFromResource(int BILD_ID, int breite, int hoehe)
{
// Device Contect für das Bild und die Oberfläche
HDC hBmDC,hSurfDC;
// Handle des Bildes
HBITMAP hBM;
// Oberflächenbeschreibung
DDSURFACEDESC2 SurfDesc;
// Zeiger auf die Oberfläche
LPDIRECTDRAWSURFACE7 lpDDSurface;
// Bild Laden
hBM = LoadBitmap(FensterInstanz,MAKEINTRESOURCE(BILD_ID));
// Ist ein Fehler während des ladens aufgetreten ?
if(NULL == hBM)
{
Log("Fehler beim Laden eines Bildes");
Log(ENDE);
return NULL;
}
// Oberflächenbeschreibung initialisieren
ZeroMemory(&SurfDesc, sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
// Caps, Höhe und Breite sollen berücksichtigt werden
SurfDesc.dwFlags = DDSD_CAPS |
DDSD_HEIGHT |
DDSD_WIDTH ;
SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
SurfDesc.dwWidth = breite;
SurfDesc.dwHeight = hoehe;
// Oberfläche anlegen
if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
{
Log("Fehler beim Anlegen einer Bildoberfläche");
Log(ENDE);
return NULL;
}
// Device Context der oberfläche holen
lpDDSurface->GetDC(&hSurfDC);
// Kompatiblen Device Context für das Bild anlegen
hBmDC = CreateCompatibleDC(hSurfDC);
// Bild in Device Context holen
SelectObject(hBmDC,hBM);
// Bild in die Oberfläche kopieren
BitBlt(hSurfDC,0,0,breite,hoehe,hBmDC,0,0,SRCCOPY);
// Device Context freigeben
lpDDSurface->ReleaseDC(hSurfDC);
// Device Context und Bild löschen
DeleteDC(hBmDC);
// Grafik löschen
DeleteObject(hBM);
// Zeiger auf die Oberfläche zurückgeben
return lpDDSurface;
} |
So lade ich das Bild dann gleich nach der Direct X inititalisierung:
Code: | lpMainMenu = CreateSurfaceFromResource(IDB_HAUPTMENU,1024,768); |
Und meine Render Funktion sieht so aus:
Code: | BOOL Render(void)
{
DDBLTFX BlitFX;
ZeroMemory(&BlitFX,0);
BlitFX.dwSize = sizeof(BlitFX);
// Hintergrundfarbe setzen
BlitFX.dwFillColor = BackgroundColor;
// Puffer löschen
if(FAILED(lpDDSBackBuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX)))
{
return FALSE;
}
if(FAILED(lpDDSBackBuffer->BltFast(0,0,lpMainMenu,NULL,DDBLT_WAIT)))
{
return FALSE;
}
// Puffer anzeigen
lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
return TRUE;
} |
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.03.2003, 15:03 Titel: |
|
|
hBM = LoadBitmap(FensterInstanz,MAKEINTRESOURCE(BILD_ID));
gibt eine boolesiche Variable und kein Handle zurück.
Zitat: | CBitmap::LoadBitmap
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
Return Value
Nonzero if successful; otherwise 0. |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 29.03.2003, 15:46 Titel: |
|
|
JJ benutzt LoadBitmap schon richtig, es ist die GDI Funkion. Es muss also an was anderem liegen. Ist FensterInstanz korrekt? Ist die Resource richtig eingebunden?
Christian |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.03.2003, 16:35 Titel: |
|
|
Aber wie wird denn hBM ohne type-cast in ein Handle umgewandelt
Geht des automatisch? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 29.03.2003, 16:56 Titel: |
|
|
hBM ist doch ein Handle. HBITMAP ist ein Handle zu einer Bitmap. :) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.03.2003, 16:59 Titel: |
|
|
Aber wenn doch die Funktion LoadBitmap eine boolesiche Variable zurückgibt... _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
DerJJ Junior JLI'ler
Anmeldedatum: 24.12.2002 Beiträge: 84
Medaillen: Keine
|
Verfasst am: 29.03.2003, 17:34 Titel: |
|
|
guck nochmal in der MSDN, da gibts es bei mir drei mal LoadBitmap...
zwei mal mit so nem Kram davor und dann einmal des aus der GDI...
Also, zu meiner FensterInstanz...
Ich hab die einmal in ner Headerdatei deklariert..
Code: |
HINSTANCE FensterInstanz;
|
Und es ist ja wohl die von meinem Fenster, und wenn da
Zitat: |
[...]
int WINAPI WinMain(HINSTANCE FensterInstanz,
HINSTANCE vorherigeInstanz,
LPSTR lpCmdLine,
int nCmdShow)
[...]
HWND CreateMainWindow(HINSTANCE FensterInstanz)
[...] | steht, oder seh ich da was falsch?
Zu der Resource...
Die resourcen datei hab ich dem Resourcen Ordner hinzugefügt und die automatisch erstellte Headerdatei hab ich auch mit eingebunden, also dadran dürfte es auch nicht liegen...+
[Edit]
ich habe grad noch sowas gefunden:
Code: | hInstance = ((LPCREATESTRUCT) lParam)->hInstance; | muss ich das vielleicht mit einbringen?
Ich habs grad mal probiert, aber da Stand dann nur das lParam nicht bekannt ist und das FensterInstanz nicht von LPCREATESTRUCT ist... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 29.03.2003, 17:43 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Aber wenn doch die Funktion LoadBitmap eine boolesiche Variable zurückgibt... |
Tut sie doch nicht. Ließ mal was Christian geschrieben hat. ;)
MSDN:
Zitat: |
HBITMAP LoadBitmap(
HINSTANCE hInstance, // handle to application instance
LPCTSTR lpBitmapName // address of bitmap resource name
);
|
_________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 29.03.2003, 18:11 Titel: |
|
|
@DerJJ:
Weiss du die Variable auch mal zu? Alleine durch
Code: |
HINSTANCE FensterInstanz = 0;
int WINAPI WinMain(HINSTANCE FensterInstanz,
HINSTANCE vorherigeInstanz,
LPSTR lpCmdLine,
int nCmdShow)
{
}
void AndereFunktionDieFensterInstanzNutzt()
{
// hier ist FensterInstanz immer noch gleich 0, weil es 2 verschiedene Variablen sind
}
|
mach lieber sowas:
Code: |
HINSTANCE g_FensterInstanz = 0;
int WINAPI WinMain(HINSTANCE FensterInstanz,
HINSTANCE vorherigeInstanz,
LPSTR lpCmdLine,
int nCmdShow)
{
g_FensterInstanz = FensterInstanz,
.....
}
|
Christian |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.03.2003, 19:21 Titel: |
|
|
sry
hab mich vertan und hab nur den ersten Eintrag in der MSDN gelesen _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
DerJJ Junior JLI'ler
Anmeldedatum: 24.12.2002 Beiträge: 84
Medaillen: Keine
|
Verfasst am: 31.03.2003, 14:34 Titel: |
|
|
Also, ich hab das jetzt so gemacht wie das Cristian gesagt hat,
aber...
wenn ich das Programm ausführe hab ich ein graues Bild, genauso wie nachdem das Programm minimiert und wieder maximiert wurde,
aber gleich nach dem Start...
Und ne Fehlermeldung hab ich garkeine!
(in meiner Log Datei) |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
DerJJ Junior JLI'ler
Anmeldedatum: 24.12.2002 Beiträge: 84
Medaillen: Keine
|
Verfasst am: 02.04.2003, 13:18 Titel: |
|
|
Hier:
Code: | /****************************
* DirectDraw initialisieren *
****************************/
int InitDirectDraw(void)
{
if(FAILED(hRes = DirectDrawCreateEx(NULL,(void**)&lpDD7,IID_IDirectDraw7,NULL)))
{
// Direct Draw Object für Win 95 anlegen
DirectDrawCreate(NULL,&lpDD,NULL);
// DirectDraw7 Schnittstelle des DirectDraw-Objects abfragen
// und einen Zeiger auf diese Schnittstelle in lpDD7 speichern
hRes = lpDD->QueryInterface(IID_IDirectDraw7,(void**)&lpDD7);
// DirectDraw-Objekt freigeben
lpDD->Release();
}
if(FAILED(hRes))
{
Log("DirecDraw7 Schnittstelle nicht verfügbar");
Log(ENDE);
return FALSE;
}
else
Log("DirectDraw7 Schnittstelle erfolgreich angelegt");
// Kooperationsebene setzen
if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
{
Log("Fehler beim Setzen des Kooperationsebene");
Log(ENDE);
return FALSE;
}
else
Log("Kooperationsebene erfolgreich gesetzt");
// Auflösung und Farbtiefe setzen
if(FAILED(lpDD7->SetDisplayMode(SCR_WIDTH,SCR_HEIGHT,COLOR_DEPTH,0,0)))
{
Log("Fehler beim Setzen des Kooperationsebene");
Log(ENDE);
return FALSE;
}
else
Log("Auflösung erfolgreich gesetzt");
// Struktur zur Beschreibung einer Oberfläche
DDSURFACEDESC2 ddsd;
// Initialisieren und Größe festlegen
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
// Die Angabe wdCaps soll berücksichtigt werden
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
// Es soll eine primäre Oberfläche angelegt werden
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
// Es soll ein Puffer angelegt werden
ddsd.dwBackBufferCount = 1;
// Oberfläche anlegen
if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
{
Log("Fehler beim Anlegen der primären Oberfläche");
Log(ENDE);
return FALSE;
}
else
Log("Primäre Oberfläche erfolgreich angelegt");
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if(FAILED(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBackBuffer)))
{
Log("Fehler beim Anlegen des Puffers");
Log(ENDE);
return FALSE;
}
else
Log("Puffer wurde erfolgreich angelegt");
return TRUE;
} |
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 03.04.2003, 13:37 Titel: |
|
|
Hmm...
da weiß ich auch nich weiter.
Ich hab selbst noch nie Surfaces mithilfe von Resourcen benutzt, sondern verwende meine Sprites immer extern. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
DerJJ Junior JLI'ler
Anmeldedatum: 24.12.2002 Beiträge: 84
Medaillen: Keine
|
Verfasst am: 03.04.2003, 17:40 Titel: |
|
|
Also, das Programm funzt ich kann auch die Hintergrundfarbe von scharz auf blau stellen, aber diese verkaggte Bild wird nicht angezeigt, und ne Fehlermeldung bekomm ich auch nicht....
Wenn wer sich das mal genauer angucken will, dann kann ich das Projekt ja mal uppen... |
|
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
|