|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 05.06.2006, 16:38 Titel: DrawText |
|
|
Hi,
Ich habe mir eine Klasse "CFont" erstellt:
Font.h
CPP: | #include <d3d9.h>
#include <d3dx9.h>
class CFont
{
public:
CFont();
virtual ~CFont();
void DrawText(LPCSTR Text, int x, int y, D3DCOLOR TextColor);
protected:
void CreateD3DFont(void);
void CleanUp(void);
//------------------------------------//
// Direct3D Variablen //
//------------------------------------//
LPDIRECT3DDEVICE9 m_lpD3DDevice;
LPD3DXFONT m_lpD3DFont;
}; |
Font.cpp CPP: | #include "Font.h"
#include <dxerr9.h>
CFont::CFont()
{
m_lpD3DFont = NULL;
m_lpD3DDevice = NULL;
}
CFont::~CFont()
{
CleanUp();
}
void CFont::DrawText(LPCSTR Text, int x, int y, D3DCOLOR TextColor)
{
RECT r = { x, y, 0, 0 };
m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CALCRECT, TextColor);
m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CENTER, TextColor);
}
void CFont::CreateD3DFont(void)
{
D3DXFONT_DESC FontDesc;
FontDesc.Height = 40;
FontDesc.Italic = FALSE;
strcpy(FontDesc.FaceName, "Verdana");
D3DXCreateFontIndirect(m_lpD3DDevice,
&FontDesc,
&m_lpD3DFont);
}
void CFont::CleanUp(void)
{
if(NULL != m_lpD3DFont)
{
m_lpD3DFont->Release();
m_lpD3DFont = NULL;
}
if(NULL != m_lpD3DDevice)
{
m_lpD3DDevice->Release();
m_lpD3DDevice = NULL;
}
} |
Nachrichtenschleife
CPP: | while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Direct3D.BeginScene();
Direct3D.DrawSurface("menubild.png");
Font.DrawText("Hallo",0,0,D3DCOLOR_XRGB(0,0,0));
Direct3D.EndScene();
}
}
return 0;
} |
Wenn ich das jetzt kompiliere wird alles Schwarz und eine Sekunde später
schaltet sich das Fenster aus, ohne etwas anzuzeigen.
Wenn ich aber die Zeile "Font.DrawText("Hallo",0,0,D3DCOLOR_XRGB(0,0,0));" aus der Nachrichtenschleife entferne, dann funktioniert alles normal.
Ich hoffe ihr könnt mir helfen |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 05.06.2006, 16:52 Titel: |
|
|
Auch wenn es idiotisch klingt, CreateD3DFont aufgerufen? |
|
Nach oben |
|
|
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 05.06.2006, 18:00 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Auch wenn es idiotisch klingt, CreateD3DFont aufgerufen? |
Ja. Es funktioniert trozdem nicht. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 05.06.2006, 18:12 Titel: |
|
|
Bub, ich tät sagen, dein Device Zeiger enthält DAtenMüll. Vielleicht solte die CreateFunktion einen Zeiger auf das Device erwarten und m_lpDevice darauf setzen, wiel sonst, naja, du benutzt m_lpDevice ohne dme jeweils was zugewiesen zu hab en, jedenfalls in dem geposteten code. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
phlip Mini JLI'ler
Anmeldedatum: 27.08.2005 Beiträge: 39
Medaillen: Keine
|
Verfasst am: 05.06.2006, 18:20 Titel: |
|
|
Hi.
Code: | void CFont::CleanUp(void)
{
if(NULL != m_lpD3DFont)
{
m_lpD3DFont->Release();
m_lpD3DFont = NULL;
}
if(NULL != m_lpD3DDevice)
{
m_lpD3DDevice->Release();
m_lpD3DDevice = NULL;
}
} |
Warum gibst du das hier das Device wieder frei? Und ausserdem wird an keiner Stelle der Zeiger zum Device übergeben...
[Edit]Wie langsam bin ich denn... ^^[/Edit] |
|
Nach oben |
|
|
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:07 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | ... naja, du benutzt m_lpDevice ohne dme jeweils was zugewiesen zu hab en, jedenfalls in dem geposteten code. |
Ich habe jetzt das m_lpD3DDevice entfernt. Es kommt nicht mehr im code vor, jetzt sieht das so aus:
Font.cpp
CPP: | #include "Font.h"
#include <dxerr9.h>
CFont::CFont()
{
m_lpD3DFont = NULL;
}
CFont::~CFont()
{
CleanUp();
}
void CFont::CreateD3DFont(void)
{
D3DXFONT_DESC FontDesc;
FontDesc.Height = 40;
FontDesc.Italic = FALSE;
strcpy(FontDesc.FaceName, "Verdana");
D3DXCreateFontIndirect(NULL,
&FontDesc,
&m_lpD3DFont);
}
void CFont::DrawText(LPCSTR Text, int x, int y, D3DCOLOR TextColor)
{
CreateD3DFont();
RECT r = { x, y, 0, 0 };
m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CALCRECT, TextColor);
m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CENTER, TextColor);
}
void CFont::CleanUp(void)
{
if(NULL != m_lpD3DFont)
{
m_lpD3DFont->Release();
m_lpD3DFont = NULL;
}
} |
Leider funktioniert es nicht
Hier sind alle Daten(108,5 kb):
DrawText |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:14 Titel: |
|
|
'D3DXCreateFontIndirect' braucht doch das Device, als 1. Parameter. |
|
Nach oben |
|
|
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:18 Titel: |
|
|
Ich habe das Device in einer anderen Datei initialisiert, aber ich weiß nicht wie ich es in Font.cpp benutzen kann. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:28 Titel: |
|
|
Du könntest z.B. der Methode 'CreateD3DFont' deiner Font-Klasse, das Device übergeben und nur zum initialisieren des Fonts benutzen. |
|
Nach oben |
|
|
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:39 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Du könntest z.B. der Methode 'CreateD3DFont' deiner Font-Klasse, das Device übergeben und nur zum initialisieren des Fonts benutzen. |
Code: | void CFont::CreateD3DFont(void)
{
LPDIRECT3DDEVICE9 m_lpD3DDevice = NULL;
D3DXFONT_DESC FontDesc;
FontDesc.Height = 40;
FontDesc.Italic = FALSE;
strcpy(FontDesc.FaceName, "Verdana");
D3DXCreateFontIndirect(m_lpD3DDevice,
&FontDesc,
&m_lpD3DFont);
} |
Meinst du das so ?? |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:41 Titel: |
|
|
Nee, eher so:
CPP: | void CFont::CreateD3DFont(IDirect3DDevice9* device)
{
D3DXFONT_DESC FontDesc;
FontDesc.Height = 40;
FontDesc.Italic = FALSE;
strcpy(FontDesc.FaceName, "Verdana");
D3DXCreateFontIndirect(device,
&FontDesc,
&m_lpD3DFont);
} |
|
|
Nach oben |
|
|
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:48 Titel: |
|
|
Funktioniert nicht
Ich glaube das Problem liegt in einer anderen Datei. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:52 Titel: |
|
|
LoL, übergibst du das Device jetzt auch beim Initialisieren, oder hast du nur deine Definition der Methode durch meine ersetzt? Auch den Prototyp in der Klassen-Deklaration angepasst? |
|
Nach oben |
|
|
matmaster Junior JLI'ler
Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 08:59 Titel: |
|
|
GreveN hat Folgendes geschrieben: | LoL, übergibst du das Device jetzt auch beim Initialisieren, oder hast du nur deine Definition der Methode durch meine ersetzt? Auch den Prototyp in der Klassen-Deklaration angepasst? |
Natürlich habe ich ihn angepasst.
Sonst würde es der Compiler nicht akzeptieren. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 09:05 Titel: |
|
|
Klang ein bisschen danach. :P
matmaster hat Folgendes geschrieben: | Ich glaube das Problem liegt in einer anderen Datei. |
Na dann zeig mal her, wo es deiner Meinung nach hängt. |
|
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
|