 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 27.11.2003, 14:24 Titel: |
|
|
Zeig doch mal bitte alle Include-Anweisungen und in welchen Dateien sie jeweils stehen. _________________ 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 |
|
 |
da-harry Mini JLI'ler

Anmeldedatum: 23.11.2003 Beiträge: 30 Wohnort: München Medaillen: Keine
|
Verfasst am: 27.11.2003, 14:34 Titel: |
|
|
Direct3D.cpp
Code: |
// VVV Einmal hier VVV
#include <d3d9.h>
#include <d3dx9.h>
class CDirect3D
{
public:
CDirect3D();
virtual ~CDirect3D();
BOOL Init(HWND hWnd, BOOL bWindowed = TRUE);
void SetClearColor(D3DCOLOR Color);
void DrawText(LPCSTR nText,
int x,
int y,
D3DCOLOR TextColor);
void BeginScene(void);
void EndScene(void);
protected:
void CreateFont(void);
void CleanUp(void);
D3DCOLOR m_ClearColor;
LPDIRECT3D9 m_lpD3D;
LPDIRECT3DDEVICE9 m_lpD3DDevice;
LPD3DXFONT m_lpD3DFont;
};
BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
{
m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(NULL == m_lpD3D)
{
MessageBox(0, "Initialisierung von DirectX fehlgeschlagen1", "FEHLER IN DER ANWENDUNG", MB_OK);
return FALSE;
}
D3DPRESENT_PARAMETERS PParams;
ZeroMemory( &PParams, sizeof(PParams) );
PParams.Windowed = TRUE;
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( m_lpD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&PParams, &m_lpD3DDevice ) ) )
{
MessageBox(0, "Fehler", "FEHLER IN DER ANWENDUNG", MB_OK);
return FALSE;
}
return TRUE;
}
// Direct3D Objekte freigeben
void CDirect3D::CleanUp(void)
{
// testen, ob die Objekt angelegt
// wurden und ggf. freigeben
if(NULL != m_lpD3DFont)
{
m_lpD3DFont->Release();
m_lpD3DFont = NULL;
}
if(NULL != m_lpD3DDevice)
{
m_lpD3DDevice->Release();
m_lpD3DDevice = NULL;
}
if(NULL != m_lpD3D)
{
m_lpD3D->Release();
m_lpD3D = NULL;
}
}
void CDirect3D::CreateFont(void)
{
LOGFONT LogFont = { 0 };
strcpy(LogFont.lfFaceName, "Fixedsys");
D3DXCreateFontIndirect(m_lpD3DDevice,
&LogFont,
&m_lpD3DFont);
}
void CDirect3D::BeginScene(void)
{
m_lpD3DDevice->Clear(0,0,
D3DCLEAR_TARGET,
m_ClearColor,
0,0);
m_lpD3DDevice->BeginScene();
}
void CDirect3D::EndScene(void)
{
m_lpD3DDevice->EndScene();
m_lpD3DDevice->Present(0,0,0,0);
}
void CDirect3D::SetClearColor(D3DCOLOR Color)
{
m_ClearColor = Color;
}
void CDirect3D::DrawText(LPCSTR nText,int x,int y,D3DCOLOR TextColor)
{
RECT r = { x, y, 0, 0 };
m_lpD3DFont->DrawText(nText,
-1,
&r,
DT_CALCRECT,
TextColor);
m_lpD3DFont->DrawText(nText,
-1,
&r,
DT_CENTER,
TextColor);
}
CDirect3D::CDirect3D()
{
m_lpD3D = NULL;
m_lpD3DDevice = NULL;
m_lpD3DFont = NULL;
}
CDirect3D::~CDirect3D()
{
CleanUp();
}
|
D3Dklasse.cpp (<<Haptprogramm)
Code: |
// VVV Und da VVV
#include "CDirect3D.cpp"
//Anwendungsfenster erzeugen:
HWND CreateMainWindow(HINSTANCE hInstance);
//Callbackfunktionen zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg,
WPARAM wParam,
LPARAM lParam);
//globale Variable für das Fenster-Handle:
HWND hWnd = 0;
CDirect3D MainD3D;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
hWnd = CreateMainWindow(hInstance);
//Fehler? (=0)
if(0 == hWnd)
{
MessageBox(0, "Fenster konnte nicht erzeugt werden!!!", "FEHLER IN DER ANWENDUNG", MB_OK);
return 0;
}
if(!MainD3D.Init(hWnd))
{
MessageBox(0, "Initialisierung von DirectX fehlgeschlagen", "FEHLER IN DER ANWENDUNG", MB_OK);
return -1;
}
//Nachrichtenstruktur
MSG msg;
//Wiederholen bis WM_Quit
while(GetMessage(&msg,NULL,0,0))
{
//Nachrichten an die Callback-Funktion schicken
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX),
CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW,
MessageHandler,
0,
0,
hInstance,
LoadIcon(NULL, IDI_WINLOGO),
LoadCursor(NULL, IDC_ARROW),
(HBRUSH)GetStockObject(WHITE_BRUSH),
NULL,
"WindowClass",
LoadIcon(NULL, IDI_WINLOGO)
};
RegisterClassEx(&wndClass);
return CreateWindowEx(
NULL,
"WindowClass",
"DirectXGraphics",
WS_VISIBLE | WS_OVERLAPPEDWINDOW,
200, 100,
800,
600,
NULL,
NULL,
hInstance,
NULL);
}
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
D3DCOLOR Text = D3DCOLOR_XRGB(0,0xFF,0);
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_PAINT:
MainD3D.BeginScene();
MainD3D.DrawText( "Hallo",
10, 10,
Text);
MainD3D.EndScene();
break;
}
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
|
|
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 27.11.2003, 14:45 Titel: |
|
|
Äähm *räusper*...da solltest eigentlich schon der Compiler meckern, weil du versuchst, eine cpp-Datei zu includen. Das geht nur mit headern(.h).
Also versuch mal, das einfach in eine Headerdatei zu schreiben und die zu includen  _________________ 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 |
|
 |
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 27.11.2003, 14:53 Titel: |
|
|
Na nun schau Dir mal Deinen Fehler genau an!
Zitat: | D3Dklasse.obj : error..............bereits in CDirect3D.obj definiert
|
1. Schritt der Fehleranalyse:
Es liegt ein Linker-Fehler vor! (siehe ....Linker-Vorgang läuft...error...)
Daraus schlussfolgern wir, das jede!!! cpp-Datei ordnungsgemäß in eine obj.-Datei compiliert und assembliert wurde!
2.Schritt der Fehleranalyse:
Wir stellen anhand der Fehlermeldung die Reihenfolge fest, in welcher der Linker die obj-Dateien binden will! Und sehen das die "CDirect3D.obj" vor "D3Dklasse.obj" genommen wird. (siehe .....D3Dklasse.obj ................bereits in CDirect3D.obj definiert )
3.Schritt der Fehleranalyse:
Wir wissen nun, das die Mehrfachdefinition durch einen Aufruf in "D3Dklasse.cpp" verursacht werden muss! Mehrfachdefinitionen kommen meist durch #include-Anweisungen zustande. Welche Anweisungen haben wir davon in "D3Dklasse.obj"? Genau: EINE.
Code: | #include "CDirect3D.cpp" |
Dabei stellen wir fest, das hierdurch beim kompilieren und assemblieren zur "D3Dklasse.obj"-Datei der komplette Code von "CDirect3D.cpp" ebenfalls in diese Datei mit kompiliert und assembl. wurde! AHA, DIE MEHRFACHDEFINITION ist gefunden! Denn wenn der Linker diese zwei voneinander getrennten obj-Dateien linken will, so findet er einmal den "CDirect3D.cpp"-Code in "CDirect3D.obj" sowie eben auch in "D3Dklasse.obj".
Wie beheben wir nun die Misere?
Wir gewöhnen uns an KEINE cpp-Dateien zu inkludieren, sondern definieren uns schöne .h-Dateien, welche die Schnittstelle zwischen mehreren cpp-Dateien übernehmen und uns vor solchen Gefahren schützen! So, nun kann es aber vorkommen, das wir selbst so eine Header-Datei mehrmals inkludieren. Dies verhindern wir durch Definition einer Konstante, die dafür sorgt, das der Header maximal einmal eingebunden wird. So stehts dann in der Header-Datei:
Code: |
#ifndef _MEIN_HEADER_
#define _MEIN_HEADER_
.... // hier die Definitionen im Header
#endif
|
Diese Header-Datei können wir nun sowohl in "CDirect3D.cpp" als auch in "D3Dklasse.cpp" einbinden und es wird zu keiner Mehrfachdefinition kommen. (BTW könnte man durch obiges Konstrukt natürlich auch eine cpp-Datei vor Mehrfachdefintion bewahren und dann diese cpp-Datei einbinden, sowas wollen wir uns aber garnicht erst angewöhnen, wenn es denn schon so eine Unterteilung gibt)
UHA, langer Text :/ |
|
Nach oben |
|
 |
da-harry Mini JLI'ler

Anmeldedatum: 23.11.2003 Beiträge: 30 Wohnort: München Medaillen: Keine
|
Verfasst am: 27.11.2003, 14:56 Titel: |
|
|
danke danke danke, du hast mir schon mal sehr geholfen!
du hast aber sicher auch ne lösung auf dieses Prob:
Code: |
.
.
.
CDirect3D.obj : error LNK2001: Nichtaufgeloestes externes Symbol _Direct3DCreate9@4
CDirect3D.obj : error LNK2001: Nichtaufgeloestes externes Symbol _D3DXCreateFontIndirect@12
Debug/D3DClass.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.
D3DClass.exe - 3 Fehler, 0 Warnung(en)
|
Was bedeutet das nun jetzt  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 27.11.2003, 15:01 Titel: |
|
|
Das sieht danach aus, dass du nicht alle nötigen libs eingebunden hast.
Falls du Christians Buch hast, kannst du das sicher meistens am Anfang des Kapitels nachlesen. _________________ 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 |
|
 |
da-harry Mini JLI'ler

Anmeldedatum: 23.11.2003 Beiträge: 30 Wohnort: München Medaillen: Keine
|
Verfasst am: 27.11.2003, 15:26 Titel: |
|
|
danke!
(bis) jetzt funktioniert alles!  |
|
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
|