JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Kapitel 19 - D3DDRAWTEXT, DrawText Fehler

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



Anmeldedatum: 23.11.2006
Beiträge: 1

Medaillen: Keine

BeitragVerfasst am: 23.11.2006, 13:57    Titel: Kapitel 19 - D3DDRAWTEXT, DrawText Fehler Antworten mit Zitat

Hallo,

ich lese zZ. das Buch "jetzt lerne ich DirectX 9 und Visual C++" weil ich in meiner Schule als Abschlussprojekt ein Programm bzw. Spiel in der Richtung schreiben will. Es ist bis jetzt auch alles gut gegangen mit dem verstehen und so, doch ich komm im oben genannten Kapitel nicht weiter. Ich muss vlt. auch dazu sagen das ich nicht die DirectX SDK Version von der CD installiert hab sondern die aktuellste die ich auf der Microsoft Page gefunden hab.

Ich werd jetzt einfach mal "mein" Source posten mit Fehlermeldung:

CPP:
///////////////////////////////
// Headerdatei


#include <d3d9.h>
#include <d3dx9.h>
#include <windows.h>


///////////////////////////////
// Funktionen / Methoden


// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

// Funktion zur Initialisierung von Direct3D
BOOL InitDirect3D(HWND hWnd);

// Direct3D-Objekte wieder freigeben
void CleanUpDirect3D(void);

// Text ausgabe
void CreateD3DFont(void);


///////////////////////////////
// Globale Variablen

// Zeiger auf das Direct3D-Objekt (Interface)
LPDIRECT3D9         lpD3D      = NULL;

// Zeiger auf das Direct3D-Device
LPDIRECT3DDEVICE9   lpD3DDevice   = NULL;

// Zeiger auf das LPD3DXFONT
LPD3DXFONT         lpD3DFont   = NULL;


// Das Fensterhandle
HWND hWnd = 0;


////////////////////////////////////////////////////////////////////////////////////////////

// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                   HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                   LPSTR lpCmdLine,          // Kommandozeile
                   int nCmdShow)             // Art wie das Fenster angezeigt werden soll
{   
    // Fenster erzeugen und Handle speichern
    hWnd = CreateMainWindow(hInstance);

    // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
        return -1;
    }

   if(!InitDirect3D(hWnd))
   {
      MessageBox(0,"Fehler beim Initialisieren von D3D","Fehler",MB_OK);
        return -1;
   }

   // Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg;
   
    // Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird
    while(GetMessage(&msg,NULL,0,0))
   {
        // Nachricht an die Callbackfunktion senden
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

   // Direct3D-Objekte wieder freigeben
   CleanUpDirect3D();

    // Rückgabewert an Windows
    return 0;
}


////////////////////////////////////////////////////////////////////////////////////////////

// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass =
    {
        sizeof(WNDCLASSEX),                                 // Größe angeben
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile       
        MessageHandler,                                     // Callback-Funktion
        0,                                                  // Zusätzliche Angaben
        0,                                                  // nicht benötigt
        hInstance,                                          // Anwendungsinstanz
        LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
        LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
        (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
        NULL,                                               // kein Menü
        "WindowClass",                                      // Der Name der Klasse
        LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
    };


    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "DirectXGraphics",        // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          100, 100, 400, 300,     // Anfangsposition und Größe
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt
}


////////////////////////////////////////////////////////////////////////////////////////////

// Diese Funktion wird von Windows aufgrufen, wenn eine Nachricht
// für Ihr Programm vorliegt

LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

   // Farbe für die Füllung des Backbuffer festlegen
    D3DCOLOR ClearColor = D3DCOLOR_XRGB(0,0,0xFF);
   D3DCOLOR TextColor   = D3DCOLOR_XRGB(0xFF,0,0);

    // testen, um welche Nachticht es sich handelt
    switch(msg)
    {
        // wenn das Fenster geschlossen wird, eine Nachricht senden,
        // die das Programm beendet
        case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                break;
      case WM_PAINT:
               // Puffer mit Blau füllen
               lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET,ClearColor,0,0);
               RECT r = { 100, 100, 0, 0 };

               lpD3DDevice->BeginScene();
               
               //1. Größe des Rechtecks brechnen
               lpD3DFont->DrawText("Hallo Direct3D", -1, &r, DT_CALCRECT, TextColor);

               //2. Text im berechneten Rechteck ausgeben; DT_CENTER (zentriert)
               lpD3DFont->DrawText("Hallo Direct3D", -1, &r, DT_CENTER, TextColor);


               lpD3DDevice->EndScene();

               lpD3DDevice->Present(0,0,0,0);
            break;
      case WM_KEYDOWN:
               PostQuitMessage(0);
               return 0;
            break;
    }

    // Wenn wir uns nicht um die Nachricht gekümmert haben
    // wird sie an die Standardnachrichtenverarbeitung von Windows
    // geschickt
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


////////////////////////////////////////////////////////////////////////////////////////////

BOOL InitDirect3D(HWND hWnd)
{
   
   // Direct3D-Objekt erzeugen
   lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

   if(NULL == lpD3D)
   {
      // Fehler beim Erzeugen des Direct-3D-Objekts
      // Kein D3D-Objekt erzeugt...
      return FALSE;
   }

   D3DPRESENT_PARAMETERS PParms;
   ZeroMemory(&PParms,sizeof(PParms));

   PParms.SwapEffect      =   D3DSWAPEFFECT_DISCARD;
   PParms.hDeviceWindow   =   hWnd;
   PParms.Windowed         =   NULL;

   PParms.BackBufferWidth   =   800;
   PParms.BackBufferHeight   =   600;
   PParms.BackBufferFormat   =   D3DFMT_A8R8G8B8;   // 32-Bit-Puffer
                                       // 8Bit Rot, 8Bit Gelb, 8Bit Blau
                                       // 8Bit Alphakanal -Transparenz
   // Direct3D-Gerät anlegen
//   D3DDevice =
   if(FAILED(lpD3D->CreateDevice(
         D3DADAPTER_DEFAULT,
         D3DDEVTYPE_HAL,
         hWnd,
         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
         &PParms,
         &lpD3DDevice)))
   {
      // Fehler Gerät kann nicht angelegt werden
      return FALSE;
   }

   return TRUE;
}


////////////////////////////////////////////////////////////////////////////////////////////
void CleanUpDirect3D(void)
{

   // Teste, ob Objekt angelegt wurde
   // wenn angelegt -> Freigeben

   // Objekte in der Reihenfolge freigeben,
   // in der sie angelegt wurden !!!

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

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


////////////////////////////////////////////////////////////////////////////////////////////
void CreateD3DFont(void)
{
   // Struktur für die Beschreibung der Schriftart anlegen und Elemente
   // mit 0 initialisieren (standart Einstellung)
   LOGFONT LogFont   = { 0 };
   
   // Nur Element der Struktur lfFaceName muss den Namen der Schriftart angeben
   // alle anderen Elemente sind Standart
   strcpy(LogFont.lfFaceName, "Arial");

   D3DXCreateFontIndirect(lpD3DDevice, &LogFont, &lpD3DFont)
   

}


Fehlermeldung beim compilen:


    --------------------Konfiguration: DirectXGraphics - Win32 Debug--------------------
    Kompilierung läuft...
    DirectXGraphics.cpp
    C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(167) : error C2660: 'DrawTextA' : Funktion akzeptiert keine 5 Parameter
    C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(170) : error C2660: 'DrawTextA' : Funktion akzeptiert keine 5 Parameter
    C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(177) : error C2360: Initialisierung von 'r' durch 'case'-Marke übersprungen
    C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(162) : Siehe Deklaration von 'r'
    C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(270) : error C2664: 'D3DXCreateFontIndirectA' : Konvertierung des Parameters 2 von 'struct tagLOGFONTA *' in 'const struct _D3DXFONT_DESCA *' nicht moeglich
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(273) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
    Fehler beim Ausführen von cl.exe.

    DirectXGraphics.exe - 5 Fehler, 0 Warnung(en)



ich hab auch schon die Version aus dem JLI Beispiel Ordner versucht... geht auch nicht

just, RyAn
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 23.11.2006, 14:56    Titel: Antworten mit Zitat

Hallo ryan

Das du die Fehler bekommst liegt wie du vielleicht dir schon dachtest daran das du eine neuere DirectX version benutzt als die aus dem Buch.

So legst du die Schriftart in Direct 9c an.
Code:

    // Struktur für die Beschreibung der Schriftart
    // anlegen und Elemente mit 0 initialisieren
    D3DXFONT_DESCA    LogFont = { 0 };

    // das Element lfFaceName muss den Namen der
    // gewünschten Schriftart enthalten
   
    strcpy(LogFont.FaceName, "Arial");

    // nach erfolgreichem Aufruf zeigt lpD3DFont
    // auf ein Objekt vom Typ D3DXFont
    D3DXCreateFontIndirect(m_lpD3DDevice,
                           &LogFont,
                           &m_lpD3DFont);

und so benutzt man sie
Code:

    RECT r = { x, y, 0, 0 };

    // Größe des Rechtecks berechnen
    m_lpD3DFont->DrawText(NULL,Text, -1, &r, DT_CALCRECT, TextColor);

    // Text ausgeben
    m_lpD3DFont->DrawText(NULL,Text, -1, &r, DT_CENTER, TextColor); 


Fals du mal zur Funktion ID3DXSprite::Draw kommst schau mal hier nach:
DirectX Draw() 9b -> 9c

Ansonsten immer mal in die Direct X Dukumentation gucken wenn man etwas nicht weiß.

Die restlichen Fehlermeldungen wie
C:\Programme\JLI Beispiele\own\DirectXGraphics\DirectXGraphics.cpp(273) : error C2143: Syntaxfehler : Fehlendes ';' vor '}' Fehler beim Ausführen von cl.exe.
Solltest du ja hoffe ich selbst behoben kommen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 23.11.2006, 15:00    Titel: Antworten mit Zitat

http://www.jliforum.de/board/viewtopic.php?t=2589&start=0
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jones
Senior JLI'ler


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 24.11.2006, 20:50    Titel: Antworten mit Zitat

Ein FAQ-Eintrag wäre vllt. hilfreich weil solche Fragen öfter mal gestellt werden...
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