JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Finde den Fehler nicht

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



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 04.01.2008, 01:01    Titel: Finde den Fehler nicht Antworten mit Zitat

Hier der Quellcode:

CPP:
/*Programmname: Directx Graphics                 */
/*Funkion     : Zeigt die Verwendung von Direct3D*/

#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <fstream>
#include <d3dx9.h>
#include <d3d9.h>   

/*Prototypen_Deklaration*/
/*Funktionsname: Callback                                      */
/*Funktion     : Kümmert sich um die Behandlung der Nachrichten*/
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam, LPARAM lParam);
/*Funktionsname: CreateMainWindow                                             */
/*Funktion     : Erzeugt das Hauptfenster und liefert ein Handle darauf zurück*/
HWND CreateMainWindow(HINSTANCE hInstance);

/*Funktionsname: InitDirect3D                               */
/*Funktion     : Initialisiert ein Direct3D-Objekt          */
BOOL InitDirect3D(HWND hWnd);


/*Funktionsname: CleanUpDirect3D                            */
/*Funktion     : Gibt das Direct3D-Ojekt wieder frei        */
BOOL CleanUpDirect3D(void);

/*Funktionsname: CreateD3DFont                              */
/*Funktion     : Erstellt die verwendete Schriftart         */
void CreateD3DFont(void);

/*Globale_Variablen*/
HWND              hWnd              = NULL;    /*Fenster_Handle*/
LPDIRECT3D9       lpD3D             = NULL;    /*D3D_Zeiger    */
LPDIRECT3DDEVICE9 lpD3DDevice       = NULL;    /*Device_Zeiger */
LPD3DXFONT        lpD3DFont         = NULL;    /*Font_Zeiger   */


/*Haupt_Programm*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nShowCmd)
{
   /*Lokale_Variablen*/
   MSG msg;            /*Nachrichten_Struktur*/

   /*CreateMainWindow() aufrufen, um das Handle des Hauptfensters zu erhalten*/
   hWnd = CreateMainWindow(hInstance);

   /*Prüfen, ob "hWnd" ein gültiges Handle besitzt*/
   if(NULL == hWnd)
   {
      MessageBox(NULL, "Das Fenster konnte nicht erstellt werden",
                "Fehler", MB_OK);

      return(-1);
   }

   /*Erzeugen des Direct3D-Objekts*/
   if(!InitDirect3D(hWnd))
   {
      MessageBox(NULL, "Directx konnte nicht korrekt initialisiert werden",
                "Directx_Fehler", MB_OK);
   }

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

   /*Direct3D-Objekt wieder freigeben*/
   CleanUpDirect3D();

   /*Programm_Beenden*/
   return(0);
}/*WinMain_Funktion*/

/*Funktions_Definition*/
/*Funktionsname: Callback                                      */
/*Funktion     : Kümmert sich um die Behandlung der Nachrichten*/
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam, LPARAM lParam)
{
   /*Lokale_Variablen*/
   D3DCOLOR ClearColor = D3DCOLOR_XRGB(0, 0, 0xFF)        ;   /*Backpuffer_Füllung*/
   D3DCOLOR TextColor  = D3DCOLOR_ARGB(0x1F, 0xFF, 0, 0)  ;   /*Text_Farbe        */

   /*Entscheiden um welche Nachricht es sich handelt*/
   switch(msg)
   {
      /*Programm_Beenden*/
   case(WM_DESTROY):
      {
         PostQuitMessage(WM_QUIT);
         return(0);
      }break;
      /*Backpuffer_Füllen*/
   case(WM_PAINT):
      {
         /*Rechteck anlegen, nur die linke obere Koordinate festlegen,*/
         /*die andere wird berechnet                                  */
         RECT r = {100, 100, 0, 0};

         /*Puffer mit Blau füllen*/
         lpD3DDevice->Clear(0, 0           ,
                           D3DCLEAR_TARGET,
                        ClearColor     ,
                        0, 0);

         lpD3DDevice->BeginScene();

         /*Größe des Rechtecks berechnen*/
         lpD3DFont->DrawTextA(NULL,
                             "Hallo Direct3D",
                         -1,
                         &r,
                         DT_CENTER,
                         TextColor);

         lpD3DDevice->EndScene();

         lpD3DDevice->Present(0, 0, 0, 0);
      }break;
   }

   /*Standardnachrichtenverarbeitung von Windows*/
   return(DefWindowProc(hWnd, msg, wParam, lParam));
}/*Callback_Funktion*/

/*Funktionsname: CreateMainWindow*/
/*Funktion     : Erzeugt das Hauptfenster und liefert das Handle zurück*/
HWND CreateMainWindow(HINSTANCE hInstance)
{
   /*Lokale_Variablen*/
   char* ClassName = "WindowClassName";

   /*Die Eigenschaften des Fensters festlegen*/
   WNDCLASSEX wndclass = {
             sizeof(wndclass)                   ,        /*Struktur_Größe       */
            CS_DBLCLKS | CS_OWNDC |                     /*Fenster_Stile        */
            CS_HREDRAW | CS_VREDRAW            ,
            MessageHandler                     ,        /*Callback_Funktion    */
            0                                  ,        /*Klassenifo_Speicher  */
            0                                  ,        /*Fenster_Speicher     */
            hInstance                          ,        /*Anwendungs_Instanz   */
            LoadIcon(NULL, IDI_WINLOGO)        ,        /*Icon_Art             */
            LoadCursor(NULL, IDC_HAND)         ,        /*Cursor_Art           */
            (HBRUSH)GetStockObject(WHITE_BRUSH),        /*Hintergrund_Farbe    */
            NULL                               ,        /*Menü_Name            */
            ClassName                          ,        /*KLassen_Name         */
            LoadIcon(NULL, IDI_WINLOGO)};               /*Icon_Art             */

   /*Fensterklasse bei RegisterClassEx() registrien, damit diese Windows bekannt ist*/
   RegisterClassEx(&wndclass);

   /*Fenster erzeugen und mittels return das Handle zurück geben*/
   return(CreateWindowEx(NULL                    ,         /*Erweiterte_Stile     */
                        ClassName               ,         /*Klassen_Name         */
                    "Directx Graphics"      ,         /*Fenster_Name         */
                    WS_OVERLAPPEDWINDOW |             /*Fenster_Eigenschaften*/
                    WS_VISIBLE              ,
                    0, 0                    ,         /*Fenster_Koordinaten  */
                    300, 400                ,         /*Fenster_Größe        */
                    NULL                    ,         /*Parent_Handle        */
                    NULL                    ,         /*Menü_Handle          */
                    hInstance               ,         /*Anwendungs_Instanz   */
                    NULL));                           /*MDI_Anwendung        */
}/*CreateMainWindow_Funktion*/

/*Funktionsname: InitDirect3D                     */
/*Funktion     : Initialisiert ein Direct3D-Objekt*/
BOOL InitDirect3D(HWND hWnd)
{
   /*Lokale_Variablen*/
   D3DPRESENT_PARAMETERS PParams;   /*Present_Parameter Struktur*/
   
   /*Erzeugen eines Direct3D-Objekts*/
   if(!(lpD3D = Direct3DCreate9(D3D_SDK_VERSION)))
   {
      MessageBox(NULL, "Das Direct3D Objekt konnte nicht initialisiert werden",
                "Directx_Fehler", MB_OK);
      return(-1);
   }

   /*Parameter für den Modus festlegen*/
   ZeroMemory(&PParams, sizeof(PParams));
   PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
   PParams.hDeviceWindow    = hWnd                 ;
   PParams.Windowed         = TRUE                 ;
   PParams.BackBufferWidth  = 800                  ;
   PParams.BackBufferHeight = 600                  ;
   PParams.BackBufferFormat = D3DFMT_A8R8G8B8      ;

   /*Direct 3D-Gerät anlegen*/
   if(FAILED(lpD3D->CreateDevice(
            D3DADAPTER_DEFAULT                 ,
           D3DDEVTYPE_HAL                     ,
           hWnd                               ,
           D3DCREATE_HARDWARE_VERTEXPROCESSING,
           &PParams                           ,
           &lpD3DDevice)))
   {
      /*Fehler, kann Gerät nicht anlegen*/
      return(FALSE);
   }

   /*Programm_Beenden*/
   return(TRUE);

}/*InitDirect3D_Funktion*/

/*Funktionsname: CleanUpDirect3D                     */
/*Funktion     : Gibt das Direct3D-Objekt wieder frei*/
BOOL CleanUpDirect3D(void)
{
   /*Prüfen, ob die Objekte angelegt wurden und ggf. freigeben*/
   if(NULL != lpD3DDevice)
   {
      lpD3DDevice->Release();
      lpD3DDevice = NULL    ;
   }

   if(NULL != lpD3D)
   {
      lpD3D->Release();
      lpD3D = NULL    ;
   }

   /*Programm_Beenden*/
   return(0);
}/*CleanUpDirect3D_Funktion*/

/*Funktionsname: CreateD3DFont                     */
/*Funktion     : Erstellt die verwendete Schriftart*/
void CreateD3DFont(void)
{
   /*Struktur für die Beschreibung der Schriftart*/
   /*anlegen und Elemente mit 0 initialisieren   */
   D3DXFONT_DESC FontDesc = {0};
   

   /*Das Element FaceName muss den Namen der gewünschten*/
   /*Schriftart enthalten                               */
   strcpy(FontDesc.FaceName, "Arial");

   /*Nach erfolgreichem Aufruf zeigt lpD3DFont*/
   /*auf ein Objekt vom Typ D3DXFont          */
   D3DXCreateFontIndirectA(lpD3DDevice,
                         (&FontDesc),
                     &lpD3DFont);
}/*CreateD3DFont_Funktion*/


Zur Erläuterung:

Zuerst hatte ich Probleme damit, dass, was mir schon reichlich seltsam vorkam, es anscheinend ein nichtaufgelöstes Symbol in der CreateD3DFont_Funktion gab. Dies gelang mir, aus Gründen die ich bis jetzt noch nicht kenne, zu bereinigen.
Nun lässt sich das Programm kompilieren und ausführen, jedoch nur so lange, bis ich eine Auskunft darüber erhalte, dass das Programm nicht mehr funktioniert.

Ich hoffe ihr könnt mir behilflich sein.

Edit(Kampfhund): code-Tags durch cpp-Tags ersetzt.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 04.01.2008, 09:37    Titel: Antworten mit Zitat

Hallo!

1)
Eine Frage: Wo rufst du denn "CreateD3DFont()" auf ? Wink

2)
CPP:
 /*Rechteck anlegen, nur die linke obere Koordinate festlegen,*/
         /*die andere wird berechnet                                  */
         RECT r = {100, 100, 0, 0};


DX-Doku hat Folgendes geschrieben:
pRect
[in] Pointer to a RECT structure that contains the rectangle, in logical coordinates, in which the text is to be formatted. As with any RECT object, the coordinate value of the rectangle's right side must be greater than that of its left side. Likewise, the coordinate value of the bottom must be greater than that of the top.


3)

CPP:
 D3DCOLOR TextColor  = D3DCOLOR_ARGB(0x1F, 0xFF, 0, 0)  ;   /*Text_Farbe        */


Hier stimmt was nicht. Ich habe es zum Testen einfach auf

CPP:
D3DCOLOR TextColor  = D3DCOLOR_ARGB(0xFF, 0xFF, 0, 0)  ;

abgeändert.

4)
Wieso hat dein Windows-Fenster eine Größe von 300x400px obwohl DirectGraphics in 800x600-Modus arbeitet?

So, jetzt funktioniert es Smile Viel Erfolg!

MfG Maxim

P.S. Vergesse nicht am Ende des Programms lpD3DFont aufzuräumen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 04.01.2008, 11:34    Titel: Antworten mit Zitat

Super Very Happy Very Happy

Herzlichen Dank
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
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 -> 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