JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Und schon wieder ein problem...
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 27.11.2003, 14:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
da-harry
Mini JLI'ler



Anmeldedatum: 23.11.2003
Beiträge: 30
Wohnort: München
Medaillen: Keine

BeitragVerfasst am: 27.11.2003, 14:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 27.11.2003, 14:45    Titel: Antworten mit Zitat

Ää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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 27.11.2003, 14:53    Titel: Antworten mit Zitat

Na nun schau Dir mal Deinen Fehler genau an! Wink
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) Smile



UHA, langer Text :/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
da-harry
Mini JLI'ler



Anmeldedatum: 23.11.2003
Beiträge: 30
Wohnort: München
Medaillen: Keine

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

danke danke danke, du hast mir schon mal sehr geholfen! Very Happy

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 Question Question Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 27.11.2003, 15:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
da-harry
Mini JLI'ler



Anmeldedatum: 23.11.2003
Beiträge: 30
Wohnort: München
Medaillen: Keine

BeitragVerfasst am: 27.11.2003, 15:26    Titel: Antworten mit Zitat

danke!

(bis) jetzt funktioniert alles! Very Happy Very Happy Very Happy Very Happy Very Happy
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
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
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