JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Programm beendet sich von selber

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



Anmeldedatum: 15.04.2003
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 17:49    Titel: Programm beendet sich von selber Antworten mit Zitat

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 Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Master_York
JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 124
Wohnort: Langenhagen(Hannover)
Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 19:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 20:52    Titel: ... Antworten mit Zitat

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



Anmeldedatum: 15.04.2003
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 16.04.2003, 07:14    Titel: Antworten mit Zitat

@Mr.X
Dann erscheint bei mir eine Fehlermeldung !?

@Master_York
Das Bild habe ich im gleichen Ordner wie die EXE.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 16.04.2003, 07:45    Titel: ... Antworten mit Zitat

siehe nachfolgender Post.....

Zuletzt bearbeitet von Mr.X am 16.04.2003, 09:17, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 16.04.2003, 09:17    Titel: ... Antworten mit Zitat

Ä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
Benutzer-Profile anzeigen Private Nachricht senden
Starwash
Senior JLI'ler


Alter: 40
Anmeldedatum: 22.09.2002
Beiträge: 252
Wohnort: Zossen (bei Berlin)
Medaillen: Keine

BeitragVerfasst am: 16.04.2003, 13:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Netmon
Mini JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 20.04.2003, 08:33    Titel: Antworten mit Zitat

@Mr.X
es fuktioniert jetzt danke nochmal.

@ApniK->Tarek
Das Bitmap war vorhanden schon vorhanden. Guck mal ein par Posts weiter oben Wink .
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