|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Netmon Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 3
Medaillen: Keine
|
Verfasst am: 15.04.2003, 17:49 Titel: Programm beendet sich von selber |
|
|
Mei Programm beendet sich immer von selber nachdem es ganz kurz im Fullscreenmode war. Ich habe zwei Dateien einmal zzf.cpp und global.h.
Hier die Quellcodes:
zzf.cpp:
Code: |
#include <windows.h>
#include <ddraw.h>
#include "global.h"
#define IMAGE_FILE "fighter.bmp"
HWND CreateMainWindow(HINSTANCE hInstance);
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
BOOL InitDirectDraw(void);
void CleanUpDirectDraw(void);
BOOL Error(char* msg);
void Render(void);
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight);
int SpriteX = 400;
int SpriteY = 300;
int x,y;
#define COLOR_DEPTH 32
#define SCR_WIDTH 800
#define SCR_HEIGHT 600
HWND hWnd = 0;
LPDIRECTDRAW7 lpDD7 = NULL;
LPDIRECTDRAWSURFACE7 lpDDSPrimary = NULL;
LPDIRECTDRAWSURFACE7 lpDDSpriteSurface = NULL;
LPDIRECTDRAWSURFACE7 lpSPrimary;
LPDIRECTDRAWSURFACE7 lpSBack;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hWnd = CreateMainWindow(hInstance);
if(0 == hWnd)
{
MessageBox(NULL,"Fehler beim Erzeugen des Fensters","ERROR",NULL);
}
if(!InitDirectDraw())
{
return FALSE;
}
lpDDSpriteSurface = CreateSurfaceFromBitmap(IMAGE_FILE,74,74);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WindowFunc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = "WindowClass";
wndClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL,
"WindowClass",
"DirectDraw",
WS_POPUP |
WS_VISIBLE,
0, 0,
SCR_WIDTH, SCR_HEIGHT,
NULL,
NULL,
hInstance,
NULL);
}
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int STEP = 4;
switch(msg)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
case VK_LEFT:
SpriteX -= STEP;
Render();
break;
case VK_RIGHT:
SpriteX += STEP;
Render();
break;
case VK_UP:
SpriteY -= STEP;
Render();
break;
case VK_DOWN:
SpriteY += STEP;
Render();
break;
}
break;
case WM_DESTROY:
CleanUpDirectDraw();
PostQuitMessage(0);
break;
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hWnd,&ps);
Render();
EndPaint(hWnd,&ps);
break;
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int InitDirectDraw(void)
{
if(FAILED(DirectDrawCreateEx(NULL,(void**)&lpDD7,IID_IDirectDraw7,NULL)))
{
return Error("Fehler beim Anlegen des DirectDraw-Objekts");
}
if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
{
return Error("Fehler beim Setzen des Kooperationsebene");
}
if(FAILED(lpDD7->SetDisplayMode(SCR_WIDTH,SCR_HEIGHT,COLOR_DEPTH,0,0)))
{
return Error("Fehler beim Setzen des Kooperationsebene");
}
DDSURFACEDESC2 SurfDesc;
ZeroMemory(&SurfDesc,sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
SurfDesc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
SurfDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX |
DDSCAPS_VIDEOMEMORY;
SurfDesc.dwBackBufferCount = 1;
if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpSPrimary,NULL)))
{
return Error("Fehler beim Anlegen der primären Oberfläche");
}
DDSCAPS2 ddCaps;
ddCaps.dwCaps = DDSCAPS_BACKBUFFER;
if(FAILED(lpSPrimary->GetAttachedSurface(&ddCaps,&lpSBack)))
{
return Error("Fehler Aufgetreten");
}
return TRUE;
}
void Render(void)
{
DDBLTFX BlitFX;
ZeroMemory(&BlitFX,0);
BlitFX.dwSize = sizeof(BlitFX);
BlitFX.dwFillColor = 0;
lpSBack->Blt(NULL,NULL,NULL,DDBLT_COLORFILL |
DDBLT_WAIT,&BlitFX);
lpSBack->BltFast(SpriteX,SpriteY,lpDDSpriteSurface,NULL,DDBLTFAST_WAIT);
lpSPrimary->Flip(NULL,DDFLIP_WAIT);
}
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight)
{
HDC hBmDC,hSurfDC;
HBITMAP hBM;
DDSURFACEDESC2 SurfDesc;
LPDIRECTDRAWSURFACE7 lpDDSurface;
hBM = (HBITMAP)LoadImage(0,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);
if(NULL == hBM)
{
return NULL;
}
ZeroMemory(&SurfDesc, sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
SurfDesc.dwFlags = DDSD_CAPS |
DDSD_HEIGHT |
DDSD_WIDTH;
SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
SurfDesc.dwWidth = dWidth;
SurfDesc.dwHeight = dHeight;
if(FAILED(lpDD7->CreateSurface(&SurfDesc,
&lpDDSurface,
NULL)))
{
return NULL;
}
lpDDSurface->GetDC(&hSurfDC);
hBmDC = CreateCompatibleDC(hSurfDC);
SelectObject(hBmDC,hBM);
BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);
lpDDSurface->ReleaseDC(hSurfDC);
DeleteDC(hBmDC);
DeleteObject(hBM);
return lpDDSurface;
}
void CleanUpDirectDraw(void)
{
if(NULL != lpDDSpriteSurface)
{
lpDDSpriteSurface->Release();
lpDDSpriteSurface = NULL;
}
if(NULL != lpDDSPrimary)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if(NULL != lpDD7)
{
lpDD7->Release();
lpDD7 = NULL;
}
}
BOOL Error(char* msg)
{
OutputDebugString(msg);
OutputDebugString("\n");
MessageBox(0,msg,"Error",MB_OK);
return FALSE;
}
|
und hier global.h:
Code: |
int ShiftRed = 0;
int ShiftGreen = 0;
int ShiftBlue = 0;
int PosRed = 0;
int PosGreen = 0;
int PosBlue = 0;
void DeterminePixelFormat(LPDIRECTDRAWSURFACE7 lpDDSpriteSurface)
{
DDPIXELFORMAT ddpf;
ddpf.dwSize = sizeof(ddpf);
lpDDSpriteSurface->GetPixelFormat(&ddpf);
while(0 == (ddpf.dwRBitMask & 1))
{
ddpf.dwRBitMask >>= 1;
PosRed++;
}
ShiftRed = (ddpf.dwRBitMask == 31) ? 3 : 2;
while(0 == (ddpf.dwGBitMask & 1))
{
ddpf.dwGBitMask >>= 1;
PosGreen++;
}
ShiftGreen = (ddpf.dwGBitMask == 31) ? 3 : 2;
PosBlue = 0;
ShiftBlue = (ddpf.dwBBitMask == 31) ? 3 : 2;
}
|
Wo ist der Fehler |
|
Nach oben |
|
|
Master_York JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 124 Wohnort: Langenhagen(Hannover) Medaillen: Keine
|
Verfasst am: 15.04.2003, 19:12 Titel: |
|
|
Bestimmt kann er die Bitmap nicht laden, weil das ist meistens so wenn er die nicht findet dann beendet sich das Programm selbst. Die bitmap muss in den Ordner sein wo die Exe ist..
bye |
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 15.04.2003, 20:52 Titel: ... |
|
|
Hi
Nimm Deine Render()-Funktion aus Deiner Nachrichtenbehandlung WM_PAINT heraus und setze sie in Deine Mainloop hinter DispatchMessage(&msg), dann geht es!!!
hier raus:
Code: |
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
break;
|
und hier rein:
Code: |
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
Render();
}
|
mfG |
|
Nach oben |
|
|
Netmon Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 3
Medaillen: Keine
|
Verfasst am: 16.04.2003, 07:14 Titel: |
|
|
@Mr.X
Dann erscheint bei mir eine Fehlermeldung !?
@Master_York
Das Bild habe ich im gleichen Ordner wie die EXE. |
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 16.04.2003, 07:45 Titel: ... |
|
|
siehe nachfolgender Post.....
Zuletzt bearbeitet von Mr.X am 16.04.2003, 09:17, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 16.04.2003, 09:17 Titel: ... |
|
|
Ändere am Ende Deiner InitDirectDraw()-Funktion dies hier:
Code: |
DDSCAPS2 ddCaps;
ddCaps.dwCaps = DDSCAPS_BACKBUFFER;
if(FAILED(lpSPrimary->GetAttachedSurface(&ddCaps,&lpSBack)))
{
return Error("Fehler Aufgetreten");
}
|
in dies hier:
Code: |
SurfDesc.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if(FAILED(lpSPrimary->GetAttachedSurface(&SurfDesc.ddsCaps,&lpSBack)))
{
return Error("Fehler Aufgetreten");
}
|
um!!! Damit ist dieser Fehler behoben.
Zusätzlich solltest Du Dein Oberflächenobjekt auch wieder frei geben!!!
Du gibst bisher in der CleanUpDirectDraw()-Funktion dies hier frei:
Code: |
if(NULL != lpDDSPrimary)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
|
Dieser Zeiger zeigt aber immer auf NULL, da Du für Dein Oberflächen-Objekt lpSPrimary nutzt, und nicht lpDDSPrimary muss es wie folgt lauten:
Code: |
if(NULL != lpSPrimary)
{
lpSPrimary->Release();
lpSPrimary = NULL;
}
|
Jetzt kannst Du auch am Anfang Deiner Datei den überflüssigen Zeiger herausnehmen! Ändere:
Code: |
LPDIRECTDRAW7 lpDD7 = NULL;
LPDIRECTDRAWSURFACE7 lpDDSPrimary = NULL;
LPDIRECTDRAWSURFACE7 lpDDSpriteSurface = NULL;
LPDIRECTDRAWSURFACE7 lpSPrimary;
LPDIRECTDRAWSURFACE7 lpSBack;
|
in das hier:
Code: |
LPDIRECTDRAW7 lpDD7 = NULL;
LPDIRECTDRAWSURFACE7 lpDDSpriteSurface = NULL;
LPDIRECTDRAWSURFACE7 lpSPrimary;
LPDIRECTDRAWSURFACE7 lpSBack;
|
mfG |
|
Nach oben |
|
|
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 16.04.2003, 13:56 Titel: |
|
|
Hi,
wenn dein Programm beim Fehlen eine Bitmap beendet wird, dann überprüf doch erst, ob die Bitmap vorhanden ist...wie diese geht findest du hier schonmal im Forum oder in Kapitel 8 (1. Buch).
Gruss Tarek |
|
Nach oben |
|
|
Netmon Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 3
Medaillen: Keine
|
Verfasst am: 20.04.2003, 08:33 Titel: |
|
|
@Mr.X
es fuktioniert jetzt danke nochmal.
@ApniK->Tarek
Das Bitmap war vorhanden schon vorhanden. Guck mal ein par Posts weiter oben . |
|
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
|