JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=bbcd20da0ea2578999523815eaac9e70Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DrawText
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 10:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 10:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 11:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
phlip
Mini JLI'ler



Anmeldedatum: 27.08.2005
Beiträge: 39

Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 11:16    Titel: Antworten mit Zitat

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



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 11:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 11:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 11:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 12:49    Titel: Antworten mit Zitat

Ich habe in der Datei Direct3D.cpp das Device bereits initialisiert, kann ich es bei Font.cpp benutzen ? Wenn Ja -> Wie?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 13:02    Titel: Antworten mit Zitat

Narf...
  1. 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

  2. Oder du machst das Device global, was aber absoluter Murks ist.

  3. 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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 13:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 14:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 15:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 15:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

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

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
matmaster
Junior JLI'ler



Anmeldedatum: 18.02.2006
Beiträge: 67
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 06.06.2006, 15:32    Titel: Antworten mit Zitat

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
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
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
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