 |
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: 06.06.2006, 10:17 Titel: |
|
|
Wenn ich "Font.DrawText("Hallo",0,0,D3DCOLOR_XRGB(0,0,0));" aufrufe dann funktioniert es nicht, wenn ich aber "Font.DrawText("Hallo",0,0,D3DCOLOR_XRGB(0,0,0));" nicht aufrufe klappt alles prima.
Aus diesem Grund glaube ich das es irgendetwas mit dem Aufruf zu tun hat, oder irgendetwas mit der Methode DrawText nicht stimmt.
Hier ist das ganze Projekt:
DrawText |
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 10:57 Titel: |
|
|
WinDbg zeigt an das der Fehler sich hier befindet:
Code: |
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); // Hier
m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CENTER, TextColor);
} |
Ich sehe hier keinen Fehler. |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.06.2006, 11:04 Titel: |
|
|
das kommt wahrscheinlich daher, dass dein m_lpD3DFont nicht ordungsgemäß funktioniert, Fehler beim Erstellen, die dir net angezeigt werden. Überprüf mal den Rückgabewert der CreateFont Funktion genauer, oder setz ein Haltepunkt für den Debugger und guck so. Der Fehler wird dir erst da in dieser Methode gezeigt, weil du m_lpD3DFont dort zum Ersten Mal benutz
Gruß DXer |
|
Nach oben |
|
 |
phlip Mini JLI'ler

Anmeldedatum: 27.08.2005 Beiträge: 39
Medaillen: Keine
|
Verfasst am: 06.06.2006, 11:16 Titel: |
|
|
Also ich hab mir das jetzt mal angeschaut. Ich hab nicht gefunden, wo du das Device übergibst.
Ich würd auch mal folgendes probieren:
Code: | void CFont::CreateD3DFont(void)
{
D3DXFONT_DESC FontDesc;
FontDesc.Height = 40;
FontDesc.Italic = FALSE;
strcpy(FontDesc.FaceName, "Verdana");
D3DXCreateFontIndirect(NULL,
&FontDesc,
&m_lpD3DFont);
if(m_lpD3DFont == NULL)
{
MessageBoxW(NULL, L"D3D Font konnte nicht erstellt werden.", L"Fehler", MB_ICONERROR);
}
} |
Da wirst du nämlich sehen, dass die Font gar nicht angelegt wird. Deshlab musst du das den Zeiger aufs Device wieder einbauen. Ohne D3DDevice kann man keine D3DFont erstellen. |
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 11:29 Titel: |
|
|
phlip hat Folgendes geschrieben: |
Da wirst du nämlich sehen, dass die Font gar nicht angelegt wird. Deshlab musst du das den Zeiger aufs Device wieder einbauen. Ohne D3DDevice kann man keine D3DFont erstellen. |
CPP: | void CFont::CreateD3DFont(IDirect3DDevice9* device)
{
D3DXFONT_DESC FontDesc;
FontDesc.Height = 40;
FontDesc.Italic = FALSE;
strcpy(FontDesc.FaceName, "Verdana");
D3DXCreateFontIndirect(device,
&FontDesc,
&m_lpD3DFont);
if(m_lpD3DFont == NULL)
{
MessageBoxW(NULL, L"D3D Font konnte nicht erstellt werden.", L"Fehler", MB_ICONERROR);
}
} |
Jetzt zeigt er die MessageBox nicht an. Aber funktionieren tut es trozdem nicht. |
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 11:38 Titel: |
|
|
WinDbg:
LoadSurface!CFont::DrawTextA(char * Text = <Memory access error>, int x = <Memory acces error>, int y = <Memory access error>, unsigned long TextColor = <Memory access error>)+0x44
Heißt das das etwas mit dem Spiecher nicht stimmt ?
Zitat: | Überprüf mal den Rückgabewert der CreateFont Funktion genauer | Wie ? |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 11:43 Titel: |
|
|
Indem du den zwischenspeicherst/ausgibst/loggst oder dergleichen, gab' afaik auch eine Funktion in D3D, die dir aus dem Rückgabewert einen String macht. Steh' leider selbst nicht ganz so tief in der Materie, als das ich mehr dazu sagen könnte...
Edit: Falsch, unter OGL gibt's so eine Funktion, D3D arbeitet mit einer Enumeration:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/dx9_graphics_reference_d3d_enums.asp
Edit2: Seh' grade, es gibt doch so eine Funktion: 'DXGetErrorDescription9'.
Zuletzt bearbeitet von GreveN am 06.06.2006, 15:26, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 12:49 Titel: |
|
|
Ich habe in der Datei Direct3D.cpp das Device bereits initialisiert, kann ich es bei Font.cpp benutzen ? Wenn Ja -> Wie? |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 13:02 Titel: |
|
|
Narf...
- Also entweder du machst das halt über den schönen, klassischen Weg, wie von mir oben angedeutet:
Direct3D.h + Font.h in main.cpp einbinden -> von D3D-Klasse Device initialisieren und zurück geben lassen -> Device der Font-Klasse übergeben
- Oder du machst das Device global, was aber absoluter Murks ist.
- Oder du machst die D3D-Klasse zum Singleton, was anfür sich sinnig ist, und lässt den Font sich das Device direkt vom Singleton holen, was auch nicht übermäßig kompliziert zu implementieren ist, ich aber als nicht so schön erachte, da du damit Abhängigkeiten etc. erzwingst, die nicht unbedingt sein müssten.
|
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 13:59 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Direct3D.h + Font.h in main.cpp einbinden -> von D3D-Klasse Device initialisieren und zurück geben lassen -> Device der Font-Klasse übergeben |
Das habe ich jetzt gemacht, es funktioniert....
....fast.
Der Text wird angezeigt, aber das Surface nicht...
Ich glaube das ich die Funktion CreateD3DFont an der falschen stelle eingefügt habe. Wo gehört es den genau hin ? |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2006, 14:04 Titel: |
|
|
matmaster hat Folgendes geschrieben: |
Ich glaube das ich die Funktion CreateD3DFont an der falschen stelle eingefügt habe. Wo gehört es den genau hin ? |
Ok, also, ich kann dir nur sagen das es in den Initialisierungsteil gehört, also HINTER D3D.Init() (bzw. deine d3d Klasse, bzw. D3D Initialisierung)und vor Font.DrawText().
Das reciht, mehr muss man im normalfall nciht beachten, wahrscheinlich ist dein Surface einfahc nur Schrott^^.
Welches Surface überhaupt? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 15:09 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | wahrscheinlich ist dein Surface einfahc nur Schrott^^. |
kann sein
DrawSurface
CPP: | void CDirect3D::DrawSurface(char* FilePath)
{
RECT r = { 0, 0, 800, 600 };
D3DXLoadSurfaceFromFile(m_lpSurface,
NULL,
NULL,
FilePath,
NULL,
D3DX_FILTER_NONE,
0,
NULL);
m_lpD3DDevice->StretchRect(m_lpSurface,
NULL,
m_lpBackBuffer,
&r,
D3DTEXF_NONE);
} | Init CPP: | BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
{
m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
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;
HRESULT hr;
if(FAILED(hr = m_lpD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&PParams,
&m_lpD3DDevice)))
{
const char* Err = DXGetErrorDescription9(hr);
DXTRACE_MSG(Err);
MessageBox(NULL, Err, "CreateDevice", MB_OK);
return FALSE;
}
m_lpD3DDevice->CreateOffscreenPlainSurface( // SURFACE
800,
600,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&m_lpSurface,
0);
m_lpD3DDevice->GetBackBuffer(0, 0,
D3DBACKBUFFER_TYPE_MONO,
&m_lpBackBuffer);
return TRUE;
} |
Nur was daran Schrott ist weiß ich nicht. |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.06.2006, 15:22 Titel: |
|
|
Waah, also Zeichenroutine und Ladefunktion haben ungefähr soviel miteinander am Hut wie der Teufel und das Weihwasser... Also 'Load-/InitSurface' und 'DrawSurface' gehören sauber getrennt, wenn du nicht willst, das dir die Anwendung spätestens an den FPS abkackt. Außerdem ist das irgenwie vermurkst bei dir, soll das Surface in deiner D3D-Klasse irgendwie ein Back/Front-Buffer sein? Da gehört eine anständige, alleinstehen Sprite-/Surface-Klasse entwickelt und das nicht so komisch mit der zentralen API-Schnittstelle gemixt. Soviel zum Designtechnischen...
Ich würde micht nicht dafür verbürgen, ob 'StretchRect' bei dir genau das tut, was es soll, also das Surface in den Backbuffer kopieren. Außerdem vermiss ich 'Present' noch etwas. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2006, 15:26 Titel: |
|
|
jo, also laden und anzeigen wsollte man halt trennen, ich schätze mal das Present wird woanders aufgerufen. Hast du mal geguckt ob die Funktion nicht fehlschlägt?
Hat das Surface ohne Text funktioneirt und jetzt nciht mehr? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
matmaster Junior JLI'ler

Anmeldedatum: 18.02.2006 Beiträge: 67 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 06.06.2006, 15:32 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Hat das Surface ohne Text funktioneirt und jetzt nciht mehr? |
Ja das Surface funktionierte ohne Text.
PS: das Present steht in der EndScene Methode |
|
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
|