JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Codes funktionieren nicht mehr?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
CorDharel
Junior JLI'ler



Anmeldedatum: 15.10.2002
Beiträge: 73
Wohnort: Winterthur, Zürich, CH
Medaillen: Keine

BeitragVerfasst am: 01.11.2004, 11:07    Titel: Codes funktionieren nicht mehr? Antworten mit Zitat

Hallo zusammen!

Ich habe ein Problem: Ich wollte ein Windowsfenster mit DirectX unterstützung machen, wie im ersten Buch beschrieben (Kapitel 17).

Ich habe mit das DirectX 9 SDK runtergeladen. Kann es nun sein dass sich alles geändert hat? Irgendwie funktioniert nichts mehr wie es sollte Crying or Very sad

Zum Beispiel heisst es im Buch "LPDIRECTDRAW7" aber keinen Fehler gibt es nur mit "LPDIRECTDRAW" ohne die Zahl. Das ist noch öfters der Fall. Oder die Funktion "DirectDrawCreateEx" findet er gar nicht.

Ich hoffe es kann mir jemand weiterhelfen!

Hier ist mein Code. Weiter bin ich nicht mehr gekommen, da er es nicht schafft die primäre Oberfläche zu generieren.

Grüsse CorDharel

Code:

#include <windows.h>
#include <ddraw.h>

//Funktionen
void Render(void);
void CleanupDirectDraw(void);
int Error(char* msg);

//anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

//callback funktion zur nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg,
                        WPARAM wParam,
                        LPARAM lParam);

//globale variable für das fensterhandle
HWND hWnd = 0;

//zeiger auf das directdraw object
LPDIRECTDRAW lpDD7 = NULL;

//zeiger auf die primäre oberfläche
LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;

//struktur zur beschreibung einer oberfläche
DDSURFACEDESC ddsd;

//zeiger auf den clipper
LPDIRECTDRAWCLIPPER lpDDClipper = NULL;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nCmdShow)
{
   
   //fenster erzeugen und handle speichern
   hWnd = CreateMainWindow(hInstance);

   //Directdraw objekt anlegen
   if( FAILED( DirectDrawCreate(NULL,&lpDD7,NULL) ) )
   {
      MessageBox(0,"DirectDraw Objekt konnte nicht erzeugt werden",
               "Fehler",MB_OK);
      return 0;
   }
   
   //kooperationsebene festlegen
   if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
   {
      MessageBox(0,"Kooperationsebene konnte nicht festgelegt werden.",
               "Fehler",MB_OK);
      return 0;
   }
   
   //primäre oberfläche initialisieren
   ZeroMemory(&ddsd,sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);
   ddsd.dwFlags = DDSD_CAPS;
   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;

   //oberfläche anlegen
   if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)));
   {
      MessageBox(0,"Oberfläche konnte nicht angelegt werden.",
               "Fehler",MB_OK);
      return 0;
   }

   if(FAILED(lpDD7->CreateClipper(NULL,&lpDDClipper,NULL)))
   {
      MessageBox(0,"Clipper konnte nicht erzeugt werden.",
               "Fehler",MB_OK);
      return 0;
   }
   
   if( 0 == hWnd )
   {
      MessageBox(0,"Fenster konnte nicht erzeugt werden",
               "Fehler",MB_OK);
      return 0;
   }

   MSG msg;

   while( GetMessage(&msg,NULL,0,0) )
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   Render();

   return 0;
}


HWND CreateMainWindow(HINSTANCE hInstance)
{
   WNDCLASSEX wndClass;

   wndClass.cbSize = sizeof(WNDCLASSEX);
   wndClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

   wndClass.lpfnWndProc = MessageHandler;

   wndClass.cbClsExtra = 0;
   wndClass.cbWndExtra  = 0;
   wndClass.hInstance = hInstance;

   wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_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_OVERLAPPEDWINDOW | WS_VISIBLE,
            0, 0,
            400, 300,
            NULL,
            NULL,
            hInstance,
            NULL);
}


LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg,
                        WPARAM wParam,
                        LPARAM lParam)
{
   switch(msg)
   {
   case WM_DESTROY:
         PostQuitMessage(0);
         return 0;
         break;
   }
   
   return ( DefWindowProc(hwnd,msg,wParam,lParam) );
}

//alle objekte freigeben
void CleanupDirectDraw(void)
{
   //prüfen ob die zeiger gültig sind
   if(NULL != lpDDSPrimary)
   {
      lpDDSPrimary->Release();
      lpDDSPrimary = NULL;
   }
/*   if(NULL != lpDDSClipper)
   {
      lpDDSClipper->Release();
      lpDDSClipper = NULL;
   }
*/   if(NULL != lpDD7)
   {
      lpDD7->Release();
      lpDD7 = NULL;
   }
}

void Render(void)
{
   //eine struktur für bliteffekte anlegen
   DDBLTFX DDBltFX;

   //initialisieren und grösse festlegen
   ZeroMemory(&DDBltFX,sizeof(DDBltFX));
   DDBltFX.dwSize = sizeof(DDBltFX);

   RECT r;
   POINT p1, p2;

   //punkte für das spätere rechteck festlegen
   p1.x = 50; p1.y = 50;
   p2.x = 100; p2.y = 100;

   //koordinaten aus dem fenster in bildschirmkoordinaten umrechnen
   ClientToScreen(hWnd,&p1);
   ClientToScreen(hWnd,&p2);

   //aus den punkten ein rechteck aufbauen
   r.left = p1.x; r.right = p2.x;
   r.top = p1.y; r.bottom = p2.y;

   for( int i=0;i<256;i++ )
   {
      //farbe setzen
      DDBltFX.dwFillColor = i*i*i;

      //rechteck nach rechts unten verschieben
      r.left++; r.top++;
      r.right++; r.bottom++;

      //rechteck auf dem bildschirm ausgeben
      if(FAILED(lpDDSPrimary->Blt(&r,NULL,NULL,DDBLT_COLORFILL |DDBLT_WAIT,&DDBltFX)))
      {
         Error("Blt ist fehlgeschlagen");
         return;
      }
   }
}

int Error(char* msg)
{
   //nachricht ausgeben
   OutputDebugString(msg);
   OutputDebugString("\n");

   //messagebox ausgeben
   MessageBox(hWnd,msg,"Fehler",MB_OK);

   return -1;
}


_________________
Greetz CorDharel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 01.11.2004, 11:10    Titel: Antworten mit Zitat

Geändert hat sichs nichts, DX ist Abwärtskompatibel.

Aber was mir aufgefallen ist:
LPDIRECTDRAW lpDD7 = NULL;

Wieso lpDD7 wenn Du nur DirectDraw1 benutzt und nicht 7?

Nebenbei: Bei DirectDraw gibt es kein Rendern sondern nur Blitten.

edit: Compilier mal das hier:
http://www.games-net.de/resource.php?action=download&id=64

Achja und gib Deine Fehler mal hier aus. Dein Code funzt bei mir ohne Probleme.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 01.11.2004, 21:35    Titel: Antworten mit Zitat

Hast du die DX-Version denn auch richtig installiert?
Schau doch mal nach, welche du aktuell installiert hast.

Ich glaube bei den Beispielprogrammen müsste ein "DxDialog.exe" dabei sein, dass dir Infos über deine DX-Version gibt Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik 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