 |
JLI Spieleprogrammierung
|
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
|
Verfasst am: 20.06.2004, 13:10 Titel: Hilfe mit Klasse |
|
|
Ich bin gerade dabei DirectX zu lernen.
Ich habe die Klasse nachprogrammiert und versuche mich gerade daran, eigene Funktionen einzuarbeiten
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 20.06.2004, 13:22 Titel: |
|
|
Diese Linkerfehler kommen, weil du d3dclass.h mehrmals einbindest.
Entweder du machst einen Schutz, damit das nicht passiert:
oder
Code: | #ifndef _HEADERNAME_
#define _HEADERNAME_
//Code
#endif |
oder du bindest den Header eben nur einmal ein  _________________ 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 |
|
 |
nerem JLI'ler

Alter: 37 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 20.06.2004, 13:38 Titel: |
|
|
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?  _________________ The killer in me is the killer in you... |
|
Nach oben |
|
 |
nerem JLI'ler

Alter: 37 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 20.06.2004, 13:52 Titel: |
|
|
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 |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
 |
nerem JLI'ler

Alter: 37 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 20.06.2004, 14:02 Titel: |
|
|
Ich BENUTZE eine Windowsanwendung  _________________ The killer in me is the killer in you... |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
 |
nerem JLI'ler

Alter: 37 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 20.06.2004, 14:13 Titel: |
|
|
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 |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 20.06.2004, 14:24 Titel: |
|
|
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 |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 20.06.2004, 14:34 Titel: |
|
|
Nein, es würde heißen, wenn _KLASSENNAME_ nicht definiert ist, dann erstell es und die Klasse.,
Ausserdem hat das LOP schon gepostet.  _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
nerem JLI'ler

Alter: 37 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 20.06.2004, 14:44 Titel: |
|
|
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
Grüße, Felix _________________ The killer in me is the killer in you... |
|
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
|