 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 04.01.2008, 01:01 Titel: Finde den Fehler nicht |
|
|
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 |
|
 |
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 04.01.2008, 09:37 Titel: |
|
|
Hallo!
1)
Eine Frage: Wo rufst du denn "CreateD3DFont()" auf ?
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 Viel Erfolg!
MfG Maxim
P.S. Vergesse nicht am Ende des Programms lpD3DFont aufzuräumen. |
|
Nach oben |
|
 |
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 04.01.2008, 11:34 Titel: |
|
|
Super
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 |
|
 |
|
|
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
|