|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ryan Mini JLI'ler
Anmeldedatum: 23.11.2006 Beiträge: 1
Medaillen: Keine
|
Verfasst am: 23.11.2006, 13:57 Titel: Kapitel 19 - D3DDRAWTEXT, DrawText Fehler |
|
|
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 |
|
|
Loigie Junior JLI'ler
Anmeldedatum: 29.06.2004 Beiträge: 52 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 23.11.2006, 14:56 Titel: |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
|
Nach oben |
|
|
Jones Senior JLI'ler
Alter: 33 Anmeldedatum: 03.03.2005 Beiträge: 208 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 24.11.2006, 20:50 Titel: |
|
|
Ein FAQ-Eintrag wäre vllt. hilfreich weil solche Fragen öfter mal gestellt werden... |
|
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
|