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 

Hilfe mit Klasse

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
nerem
JLI'ler


Alter: 37
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 13:10    Titel: Hilfe mit Klasse Antworten mit Zitat

Ich bin gerade dabei DirectX zu lernen.
Ich habe die Klasse nachprogrammiert und versuche mich gerade daran, eigene Funktionen einzuarbeiten Wink
Ich habe nun eine Funktion hinzugefügt, mit der es möglich sein sollte, ein Surface in beliebig viele Teile aufzuteilen und diese mit verschiedenen Farben zu füllen!
Wenn ich den Code durchlaufen lasse, also den Compiler nach Fehlern suchen lasse zeigt er mir an, dass keine Fehler und keine Warnungen vorhanden sind!
Will ich das Programm jedoch ausführen kommen folgende Fehler:

Code:

--------------------Konfiguration: D3DClass - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
Linker-Vorgang läuft...
main.obj : error LNK2005: "struct tagRECT Surface" (?Surface@@3UtagRECT@@A) bereits in d3dclass.obj definiert
main.obj : error LNK2005: "struct HWND__ * hWnd" (?hWnd@@3PAUHWND__@@A) bereits in d3dclass.obj definiert
main.obj : error LNK2005: "class CDirect3D Direct3D" (?Direct3D@@3VCDirect3D@@A) bereits in d3dclass.obj definiert
Debug/D3DClass.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
Fehler beim Ausführen von link.exe.

D3DClass.exe - 4 Fehler, 0 Warnung(en)


Ich weis nicht woran es liegt!
Da ich eben nicht die geringste Ahnung habe, wo der Fehler entsteht wird mir wohl oder übel nichts übrig bleiben, als den kompletten Code anzuhängen!
Wäre nett, wenn sich jm die Mühe machen würde!
(Ich kann auch nicht mit Doppelklick auf die Fehler zu Marke springen...)
Vielen Dank im Voraus!
Grüße. Felix



CODE:

d3dclass.h:
Code:

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


// Struktur zum unterteilen der Surfaces in verschiedene Bereiche
struct SurfaceRect
{
     int x;
     int y;
     int x2;
     int y2;
     D3DCOLOR Color;
};

class CDirect3D
{
   public:

      // Konstruktor und Destruktor
      CDirect3D();
      virtual ~CDirect3D();

      // D3D Initialisieren
      BOOL Init(HWND hWnd, BOOL bWindowed);

      // Clearcolor setzen
      void SetClearColor(D3DCOLOR Color);

      // Text ausgeben
      void WriteText(LPCSTR Text, int x, int y, D3DCOLOR TextColor);

      // Schrift anlegen
      void InitFont(LPCSTR Font);

      // Surface anlegen
      void CreateSurface(int x, int y);

      // Surface in Bereiche unterteilen / mit Farben füllen
      void SurfaceColorFill(SurfaceRect SR[], int anzahl);

      // Surface kopieren
      void DrawSurface(RECT DestRect);

      // Beginn und Ender der Szene
      void BeginScene(void);
      void EndScene(void);

      // Objekte freigeben
      void CleanUp(void);



   protected:

      // Clear Color
      D3DCOLOR         m_ClearColor;

      // D3D Variablen
      LPDIRECT3D9         m_lpD3D;
      LPDIRECT3DDEVICE9   m_lpD3DDevice;
      LPD3DXFONT         m_lpD3DFont;
      LPDIRECT3DSURFACE9   m_lpD3DSurface;
      LPDIRECT3DSURFACE9 m_lpBackBuffer;

};





global.h:
Code:

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



// Prototypen

// Anwendungsfenster
HWND CreateMainWindow(HINSTANCE hInstance);

// Callbackfunktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam,
                        LPARAM lParam);


// globale Variablen

// Var für Fensterhandle
HWND hWnd = NULL;


// RECT für Surface
RECT Surface = {50, 50, 150, 150 };

CDirect3D Direct3D;





d3dclass.cpp:
Code:

#include "d3dclass.h"
#include "global.h"



CDirect3D::CDirect3D()
{
    m_lpD3D          = NULL;
    m_lpD3DFont       = NULL;
    m_lpD3DSurface    = NULL;
    m_lpD3DDevice    = NULL;
    m_lpBackBuffer    = NULL;
}

CDirect3D::~CDirect3D()
{
    CleanUp();
}

// D3D INITIALISIEREN
BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
{
   m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

   // Fehleranalyse
   if(NULL == m_lpD3D)
   {
      return FALSE;
   }


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

   PParams.SwapEffect               = D3DSWAPEFFECT_DISCARD;
   PParams.hDeviceWindow            = hWnd;
   PParams.Windowed               = bWindowed;
   PParams.BackBufferWidth            = 800;
   PParams.BackBufferHeight         = 600;
   PParams.BackBufferFormat         = D3DFMT_A8R8G8B8;

   if(FAILED(m_lpD3D->CreateDevice(
               D3DADAPTER_DEFAULT,
               D3DDEVTYPE_HAL,
               hWnd,
               D3DCREATE_SOFTWARE_VERTEXPROCESSING,
               &PParams,
               &m_lpD3DDevice)))
   {
      return FALSE;
   }


   return TRUE;
}



// CLEARCOLOR SETZEN
void CDirect3D::SetClearColor(D3DCOLOR Color)
{
   m_ClearColor = Color;
}



// D3D CLEANUP
void CDirect3D::CleanUp(void)
{
   if(NULL != m_lpBackBuffer)
   {
      m_lpBackBuffer->Release();
      m_lpBackBuffer = NULL;
   }

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

   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;
   }
}



// CREATE FONT
void CDirect3D::InitFont(LPCSTR Font)
{
   LOGFONT LogFont = {0};
   strcpy(LogFont.lfFaceName, Font);

   D3DXCreateFontIndirect(m_lpD3DDevice,
                     &LogFont,
                     &m_lpD3DFont);
}



// BEGIN SCENE
void CDirect3D::BeginScene(void)
{
   // Backbuffer mit Clearcolor füllen
   m_lpD3DDevice->Clear(0,0,
                   D3DCLEAR_TARGET,
                   m_ClearColor,
                   0,0);

   // Szene beginnt
   m_lpD3DDevice->BeginScene();
}



// END SCENE
void CDirect3D::EndScene(void)
{
   // Szene endet
   m_lpD3DDevice->EndScene();

   // Backbuffer anzeigen
   m_lpD3DDevice->Present(0,0,0,0);
}



// WRITE TEXT
void CDirect3D::WriteText(LPCSTR Text,int x, int y, D3DCOLOR TextColor)
{
   RECT r = { x, y, 0, 0};

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

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



// CREATE SURFACE
void CDirect3D::CreateSurface(int x, int y)
{
   RECT r1 = { 0, 0, x, y };

   m_lpD3DDevice->CreateOffscreenPlainSurface(
                               x,
                               y,
                               D3DFMT_A8R8G8B8,
                               D3DPOOL_DEFAULT,
                               &m_lpD3DSurface,
                               0);

   m_lpD3DDevice->ColorFill(m_lpD3DSurface,&r1,0xF0FF0000);

}




// DRAW SURFACE
void CDirect3D::DrawSurface(RECT DestRect)
{
   // Zeiger auf Hintergrundbuffer holen
   m_lpD3DDevice->GetBackBuffer(0,0,
                         D3DBACKBUFFER_TYPE_MONO,
                         &m_lpBackBuffer);

   // OffscreenSurface kopieren
   m_lpD3DDevice->StretchRect(m_lpD3DSurface,
                        NULL,
                        m_lpBackBuffer,
                        &DestRect,
                        D3DTEXF_NONE);
}



// SURFACE COLORFILL
void CDirect3D::SurfaceColorFill(SurfaceRect SR[], int anzahl)
{
   for(int i=0;i<anzahl;i++)
   {
      RECT r = { SR[i].x, SR[i].y, SR[i].x2, SR[i].y2 };
      m_lpD3DDevice->ColorFill(m_lpD3DSurface,&r,SR[i].Color);
   }
}







main.cpp:
Code:

// erstellt ein einfaches Windows Fenster


#include <d3d9.h>
#include <d3dx9.h>
#include <iostream.h>
#include <windows.h>
#include "d3dclass.h"
#include "global.h"


int WINAPI WinMain(HINSTANCE hInstance,
               HINSTANCE hPrevInstance,
               LPSTR lpCmdLine,
               int nShowCmd)
{
   // Fenster erzeugen und Handle speichern
   hWnd = CreateMainWindow(hInstance);

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

   if(!Direct3D.Init(hWnd, FALSE))
   {
      return -1;
   }

   Direct3D.InitFont("Arial");
   Direct3D.SetClearColor(D3DCOLOR_XRGB(0,0,0xFF));


   // 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 Callbackfunktion schicken
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   // Rückgabewert an Windows
   return 0;
}



HWND CreateMainWindow(HINSTANCE hInstance)
{
   WNDCLASSEX wndClass;  // WNDCLASSEX Struktur

   // Struktur initialisieren
   wndClass.cbSize = sizeof(WNDCLASSEX);      // Grösse
   wndClass.style = CS_DBLCLKS | CS_OWNDC |   // Standard
                CS_HREDRAW | CS_VREDRAW;

   // Callbackfunktion angeben
   wndClass.lpfnWndProc = MessageHandler;

   wndClass.cbClsExtra = 0;         
   wndClass.cbWndExtra = 0;
   wndClass.hInstance = hInstance;            // Anwendungsinstanz

   // Weisser Fensterhintergrund
   wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

   // Standard Muscursor wählen
   wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

   // kein Menü
   wndClass.lpszMenuName = NULL;

   // Name der Fensterklasse
   wndClass.lpszClassName = "WindowClass";

   // Icons
   wndClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
   wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

   // Fensterklasse registrieren
   RegisterClassEx(&wndClass);

   // Rückgabe
   return CreateWindowEx(
               NULL,
               "WindowClass",
               "Windows Fenster",
               WS_OVERLAPPEDWINDOW |
               WS_VISIBLE,
               0,0,
               400,300,
               NULL,
               NULL,
               hInstance,
               NULL);
}


LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam)
{
   // welche Nachricht?
   switch(msg)
   {
      // Wenn das Fenster geschlossen wird, WM_QIUT senden
   case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
         break;


   case WM_PAINT:   
            // RectStrukt Element für die Unterteilung des Surfaces
            SurfaceRect SR[2];
   
            SR[0].x = 0;
            SR[0].y = 0;
            SR[0].x2 = 50;
            SR[0].y2 = 50;
            SR[0].Color = D3DCOLOR_XRGB(0xFF,0xAA,0);
            SR[1].x = 50;
            SR[1].y = 50;
            SR[1].x2 = 100;
            SR[1].y2 = 100;
            SR[1].Color = D3DCOLOR_XRGB(0,0xFF,0xFF);
            
            Direct3D.BeginScene();
               Direct3D.CreateSurface(Surface.right, Surface.bottom);
               Direct3D.SurfaceColorFill(SR,2);
               Direct3D.DrawSurface(Surface);
               Direct3D.WriteText("ionic Software", 350, 250, D3DCOLOR_XRGB(0xFF,0xAA,0));
            Direct3D.EndScene();
         break;

   case WM_KEYDOWN:

            switch(wParam)
            {
               // mit ESC beenden
            case VK_ESCAPE:
                  DestroyWindow(hWnd);
               break;
            }
         break;
   }

   // Standardnachrichtenverarbeitung aller nich behandelten Messages
   return (DefWindowProc(hWnd,msg,wParam,lParam));
}




Die Fehler kommen erst, seit ich versucht habe die neue Funktion SurfaceColorFill(SurfaceRect SR[], int Anzahl); zu nutzen!
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 13:22    Titel: Antworten mit Zitat

Diese Linkerfehler kommen, weil du d3dclass.h mehrmals einbindest.
Entweder du machst einen Schutz, damit das nicht passiert:
Code:
#pragma once

oder
Code:
#ifndef _HEADERNAME_
#define _HEADERNAME_

//Code

#endif


oder du bindest den Header eben nur einmal ein 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
nerem
JLI'ler


Alter: 37
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 13:38    Titel: Antworten mit Zitat

Tja leider bleiben die Fehler bestehen!
Sie waren ja vor der Nutzung und implementierung der Funktion SurfaceColorFill(SurfaceRect SR[], int anzahl) au net vorhanden!

edit: PS: Wie gehts deinem RPG? Very Happy
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nerem
JLI'ler


Alter: 37
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 13:52    Titel: Antworten mit Zitat

Mh mit dem 2. von dir komm ich jetz nur noch auf 2 Fehler:

Code:

--------------------Konfiguration: D3DClass - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
Linker-Vorgang läuft...
LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/D3DClass.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

D3DClass.exe - 2 Fehler, 0 Warnung(en)


Wie beheb ich das noch???
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 13:55    Titel: Antworten mit Zitat

Benutzt eine Windowsanwendung -.-
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nerem
JLI'ler


Alter: 37
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 14:02    Titel: Antworten mit Zitat

Ich BENUTZE eine Windowsanwendung Rolling Eyes
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 14:02    Titel: Antworten mit Zitat

Genau...siehe auch FAQ: http://www.jliforum.de/board/viewtopic.php?t=2289

nerem hat Folgendes geschrieben:
edit: PS: Wie gehts deinem RPG? Very Happy

Gut, der Betatest fängt bald an 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
nerem
JLI'ler


Alter: 37
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 14:13    Titel: Antworten mit Zitat

Ich habe jetzt extra nochmal ein neues Winprojekt erstellt, die Dateien angelegt und den Code kopiert und ich bin so weit wie davor!
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

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

Hallo,

mach mal in jede Hederdatei forgendes rein:

Code:

#ifndef _KLASSENNAME_
#define _KLASSENNAME_

#include ...

class KLASSENNAME
{
    ....
};

#endif



Auf deutsch würde das heißen, wenn die Klasse nicht vorhanden dann erstellen.
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

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

Nein, es würde heißen, wenn _KLASSENNAME_ nicht definiert ist, dann erstell es und die Klasse.,

Ausserdem hat das LOP schon gepostet. Wink
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nerem
JLI'ler


Alter: 37
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.06.2004, 14:44    Titel: Antworten mit Zitat

K, BladeGool hat mir geholfen!
Anscheinend hatte ich zu viele includes, auch von anderen Headern^^
Naja, danke an alle, die mir versucht haben zu helfen und besonderen Dank an BladeGool Very Happy

Grüße, Felix
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL 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