JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

DrawText
Gehe zu Seite 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: 05.06.2006, 16:38    Titel: DrawText Antworten mit Zitat

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


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

BeitragVerfasst am: 05.06.2006, 16:52    Titel: Antworten mit Zitat

Auch wenn es idiotisch klingt, CreateD3DFont aufgerufen?
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: 05.06.2006, 18:00    Titel: Antworten mit Zitat

GreveN hat Folgendes geschrieben:
Auch wenn es idiotisch klingt, CreateD3DFont aufgerufen?

Ja. Es funktioniert trozdem nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.06.2006, 18:12    Titel: Antworten mit Zitat

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



Anmeldedatum: 27.08.2005
Beiträge: 39

Medaillen: Keine

BeitragVerfasst am: 05.06.2006, 18:20    Titel: Antworten mit Zitat

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... Embarassed ^^[/Edit]
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, 08:07    Titel: Antworten mit Zitat

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 Sad

Hier sind alle Daten(108,5 kb):
DrawText
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


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

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

'D3DXCreateFontIndirect' braucht doch das Device, als 1. Parameter.
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, 08:18    Titel: Antworten mit Zitat

Ich habe das Device in einer anderen Datei initialisiert, aber ich weiß nicht wie ich es in Font.cpp benutzen kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


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

BeitragVerfasst am: 06.06.2006, 08:28    Titel: Antworten mit Zitat

Du könntest z.B. der Methode 'CreateD3DFont' deiner Font-Klasse, das Device übergeben und nur zum initialisieren des Fonts benutzen.
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, 08:39    Titel: Antworten mit Zitat

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


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

BeitragVerfasst am: 06.06.2006, 08:41    Titel: Antworten mit Zitat

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
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, 08:48    Titel: Antworten mit Zitat

Funktioniert nicht Sad

Ich glaube das Problem liegt in einer anderen Datei.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


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

BeitragVerfasst am: 06.06.2006, 08:52    Titel: Antworten mit Zitat

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
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, 08:59    Titel: Antworten mit Zitat

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


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

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

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
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 1, 2, 3  Weiter
Seite 1 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