Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.09.2010, 15:43

SDL_ttf.dll nicht gefunden obwohl vorhanden

Hey erstmal.
Ich denke mal ihr seit das Thema leid um diese lib aber ich habe hier echt ein hartnäckiges Problem.
Ich bin grade das Spiel aus dem Buch am verändern und wollte mich jetzt um eine Textausgabe kümmern.
Ich habe zwar Erfahrung in C/C++ (habe es seit fast 3 Jahren in der Schule) allerdings wusste ich nicht recht wie ich an die Sache rangehen sollte.
Nach ein bisschen googeln habe ich die SDL_ttf gefunden, habe sie mir gedownloadet alles im Projekt eingebunden will es nun Testweise mit einer erstellten Klasse von einem User aus diesem Forum debuggen und jetzt sagt er mir das er die SDL_ttf.dll nicht findet obwohl ich sie eingebunden habe.
Ich hoffe einer kann mir nochmal erklären wie man die dll einbindet damit ich überprüfen kann ob das richtig war wie ich das gemacht habe.
Kann sonst leider nicht weiter machen.

Vielen Dank im voraus.

MfG Deadmac

2

21.09.2010, 16:13

Du kannst eine DLL nicht "einbinden" du musst sie nur in den ordner legen von dem aus ausgeführt wird.
Metal ist keine Musik sondern eine Religion.

3

21.09.2010, 18:20

Super danke.
Dann hatte ich an libs gedacht die ja dll´s mit einbeziehen.
Soweit funzt es auch nun aber jetzt erkennt der bei mir eine Sache nicht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef TEXTAUSGABE_HPP
#define TEXTAUSGABE_HPP
#include <iostream> 
#include <list>
#include <sstream>
#include "Singleton.hpp"
#include "Framework.hpp"
#include "SDL_ttf.h"
//#pragma comment(lib, "SDL_ttf.dll")




using namespace std;

#define g_pText CText::Get()

class CText : public TSingleton<CText>
{
  public:
    
    // Initalisieren
    bool Init ();
    // Font öffnen
    TTF_Font* Open (const int Zahl, const size);
    // String schreiben
    void Write(TTF_Font* Font,const char *text,int x_pos,int y_pos,int R,int G,int B);
    // Int schreiben
    void Write(TTF_Font* Font,const float Number,int x_pos,int y_pos,int R,int G,int B);
    // Sicher beenden
    void Quit ();
  private:
    TTF_Font* m_Font; //aktuelle Font

    list<TTF_Font*> m_Fontlist;//Liste mit allen Fonts

    SDL_Surface *m_pscreen;

};

#endif

TTF_Font* Open hierzu sagt er mir
Fehlender Typenspezifizierer - int wird angenommen
Mir ist klar das ich da eigentlich etwas vor schreiben muss allerdings weiss ich nicht ganz was.

C-/C++-Quelltext

1
2
3
4
5
6
TTF_Font* CText::Open (const int Zahl, const size)
{
    m_Font = TTF_OpenFont("FreeSansBold.ttf", size);
    m_Fontlist.push_back (m_Font);
    return  m_Font;
}

Das ist dann noch die Funktion selber

4

21.09.2010, 22:10

Hallo Deadmac,

denk vielleicht erst noch einmal über deine Klasse nach...

Ich würde dir empfehlen eine Klasse anzulegen, die eine (Text-)Ausgabe repräsentiert und nicht eine Klasse, die alle geladenenen Schriftarten hält und für alle Ausgaben gleichzeitig verantwortlich ist, weil du nur mit dieser Klasse schreiben kannst.

Erst einmal gibt es Konstruktoren und Destruktoren, die du statt Init() und Quit() benutzen solltest.
Dann braucht deine Funktion Open() keinen Zeiger auf die Schrift zurückgeben, wenn du doch diesen (und alle weiteren) Zeiger innerhalb der Klasse speicherst - da kannst du sie doch dann herholen.
Hier für eignet sich allerdings keine Liste, da du bei einer Liste nicht auf bestimmte Elemente zugreifen kannst - jedenfalls nicht ohne den Umweg über eine Schleife die die komplette Liste nach der gewünschten Schriftart durchsucht. Wenn schon, dann eher ein Vektor statt einer Liste.

Ich schlage so etwas wie eine CTextOutput Klasse vor. Dort speicherst du einen Zeiger auf die Schriftart, in der der Text dargestellt werden soll - so kannst du jederzeit die Schriftart ändern, indem du nur den Zeiger änderst.
Dann speicherst du in einer Membervariable den Text, der geschrieben werden soll, so kannst du auch den jederzeit bequem ändern und vor allem auch auslesen.
Außerdem verpasst du der Klasse eine Funktion die dir den Text auf eine Surface rendert und eine weitere Funktion die dir diese Surface zurückgibt. So kannst du beim Rendern deines Spiels dir diese Surface geben lassen und auf den Bildschirm zeichnen ohne bei jedem Durchgang den Text neu rendern zu müssen. (Spart Rechenzeit!) Das musst du nur tun, wenn sich der Text ändert.
So Dinge wie z.B. Schriftgröße, -farbe oder Position kannst du dann natürlich auch noch hinzufügen.

Hoffe du kannst damit etwas anfangen?!

Gruß
SaRu_

5

21.09.2010, 22:22

Also erstmal danke für die Antwort.
Zu meiner schande muss ich gestehen das dies nicht meine Klasse ist.
da ich echt frisch bin in der Spiele bzw Grafischenprogrammierung werde ich wohl jetzt die nächsten Tage an der Klasse sitzen ^^
Aber ich danke dir trotzdem.
Werde natürlich gucken das ich das umgesetzt bekomme

6

21.09.2010, 23:09

N'abend Deadmac,

hier mal eine kleine, simple Umsetzung, damit du vielleicht besser vorankommst...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// CTextOutput.h
class CTextOutput
{
public:
    CTextOutput ();
    ~CTextOutput();

    void            SetFont     (TTF_Font* Font) { m_pFont = Font; RenderText(); }
    TTF_Font*       GetFont     () { return m_pFont; }

    void            SetText     (string Text) { m_sText = Text; RenderText(); }
    string          GetText     () { return m_sText; }

    void            SetColor    (SDL_Color Color) { m_Color = Color; RenderText(); }
    SDL_Color       GetColor    () { return m_Color; }

    SDL_Surface*    GetSurface  () { return m_pSurface; }

private:

    void            RenderText  ();

    SDL_Surface*    m_pSurface;
    TTF_Font*       m_pFont;
    SDL_Color       m_Color;
    string          m_sText;

};


// CTextOutput.cpp
CTextOutput::CTextOutput ()
{
    // Zeiger sicherheitshalber NULL setzen
    m_pSurface = NULL;
    m_pFont = NULL;

    // Standardfarbe: Schwarz
    m_Color.r = 0;
    m_Color.g = 0;
    m_Color.b = 0;

    // Noch kein Text
    m_sText = "";

}

CTextOutput::~CTextOutput ()
{
    // Surface freigeben
    SDL_FreeSurface(m_pSurface);

}

void    CTextOutput::RenderText ()
{
    // Text auf Surface rendern
    m_pSurface = TTF_RenderText_Solid(m_pFont, m_sText.c_str(), m_Color);

    // Gab es Probleme?
    if(m_pSurface == NULL)
        cout << "Fehler beim Rendern der Schrift: " << TTF_GetError() << endl;
}



// Komplettes Anwendungsbeispiel:

// BEIM LADEN DES SPIELS

// Neue Schriftart laden
TTF_Font* pFont = TTF_OpenFont("MyFont.ttf", 16);

// Fehler beim Laden der Schriftart?
if(m_pFont == NULL)
{
    cout << "Fehler beim Laden der Schriftart: " << TTF_GetError() << endl;
    return -1;
}

// Schriftfarbe festlegen
SDL_Color Textcolor;
Textcolor.r = 123;
Textcolor.g = 213;
Textcolor.b = 132;

// Neues Text-Objekt
CTextOutput* pText = new CTextOutput();

// Schriftart, Text & Farbe setzen
pText->SetFont(pFont);
pText->SetText("Hallo Welt");
pText->SetColor(Textcolor);

// Position der Text-Ausgabe: (100|100)
SDL_Rect Rect;
Rect.x = 100;
Rect.y = 100;
Rect.w = pText->GetSurface()->w;
Rect.h = pText->GetSurface()->h;

// BEIM RENDERN DES SPIELS

// Text-Ausgabe auf Bildschirm zeichnen 
SDL_BlitSurface(pText->GetSurface(), NULL, m_pScreen, &Rect);

// BEIM BEENDEN DES SPIELS

// Zum Schluss Text-Objekt & Schriftart löschen
delete(pText);
TTF_CloseFont(pFont);



Vielleicht kannst du ja damit etwas anfangen. Der Code ist nicht getestet und sehr einfach gehalten. Ich verzichte auf Rückgabewerte oder brauchbare Fehlermeldungen bzw. Exceptions usw.


Gruß
SaRu_

7

22.09.2010, 15:48

Ouh man.
Danke hatte jetzt nicht verlang das einer da was macht aber danke danke.
Werde mich direkt mal dran begeben die ganze Sache nach zu vollziehen und dann zu verbessern bzw. in meinem Spiel zu verwenden.
Vielen Dank nochmal
MfG
Deadmac

Quin

Frischling

Beiträge: 23

Wohnort: Engelthal

  • Private Nachricht senden

8

24.09.2010, 14:22

Du kannst dir ja mal meine Klasse dafür anschaun, die benutze ich auch für meine SDL Spiele, ist aber nicht die Beste :whistling: . Aber für den Anfang reicht sie aus.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#ifndef _TTF_H_
#define _TTF_H_

#include <sstream>
#include "Framework.h"

class TTF
{
  public:
    enum eTextType {SOLID, SHADED, BLENDED};

    TTF  ();
    ~TTF ();

    void Load       (const string &sFilename, int Size);
    void SetPos     (float fXPos, float fYPos);
    void SetColor   (int R, int G, int B);
    void SetBGColor (int R, int G, int B);
    void SetText    (string sText);
    void SetText    (int Number);
    void SetType    (int Type);
    void SetSize    (int Size);
    void Render     ();
    void Render     (SDL_Surface *pSurface);

    SDL_Rect     GetRect      () const {return m_Rect;}
    SDL_Surface *GetSurface   () const {return m_pText;}
    SDL_Color    GetTextColor () const {return m_TextColor;}
    SDL_Color    GetBGColor   () const {return m_BGColor;}
    string       GetText      () const {return m_sText;}
    string       GetFilename  () const {return m_sFontFilename;}
    int          GetType      () const {return m_Type;}
    int          GetIntText   ();

  private:
    void RenderTextSurface ();

    TTF_Font *m_pFont;          // Zeiger des Textfonts
    SDL_Surface *m_pText;       // Zeiger des Textimages
    SDL_Surface *m_pScreen;     // Zeiger auf den Screen des Frameworks
    SDL_Rect m_Rect;            // Rect des Textes
    SDL_Color m_TextColor;      // Textfarbe
    SDL_Color m_BGColor;        // Texthintergrundfarbe
    string m_sFontFilename;     // Pfad des Fonts
    int m_Size;                 // Schriftgrösse
    int m_Type;                 // Schrifttyp
    string m_sText;             // String des Textes
    int m_Text;                 // Wenn der Text eine int-Wert ist

};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#include "TTF.h"

// Konstruktor
//
// Aufgabe: Allgemeine Initialisierung
//
TTF::TTF()
{
    // Zeiger von Screen holen
    m_pScreen = g_pFramework->GetScreen();

    // Textfarbe
    m_TextColor.r = m_TextColor.g = m_TextColor.b = 255;

    // Hintergrundfarbe
    m_BGColor.r = m_BGColor.g = m_BGColor.b = 0;

    // Schrifttyps
    m_Type = TTF::SOLID;

    // Anfangswert von m_Text (int)
    m_Text = 0;

    // Zeiger auf NULL setzen
    m_pFont = NULL;
    m_pText = NULL;

} // Konstruktor

// Destruktor
// 
// Aufgabe: Font schliessen und Speicher freigeben
//
TTF::~TTF()
{
    // Font schliessen
    if (m_pFont != NULL)
    {
        TTF_CloseFont(m_pFont);
        m_pFont = NULL;
    }
    
    // Surface freigeben
    if (m_pText)
    {
        SDL_FreeSurface(m_pText);
        m_pText = NULL;
    }

} // Destruktor

// Load
//
// Aufgabe: Font laden
//
void TTF::Load(const string &sFilename, int Size)
{
    m_sFontFilename = sFilename;
    
    // Wenn ein Font geladen ist wird er geschlossen
    if (m_pFont)
    {
        TTF_CloseFont(m_pFont);
    }
    
    // Font laden
    m_pFont = TTF_OpenFont(m_sFontFilename.c_str(), Size);

    // Bei einen Fehler wird die Anwendung beendet
    if (m_pFont == NULL)
    {
        cout << "Font konnte nicht geladen werden!" << endl;

        g_pFramework->Quit();
    }

    // Rect initialisieren
    m_Rect.x = 0;
    m_Rect.y = 0;
    m_Rect.w = 0;
    m_Rect.h = 0;

} // Load

// TextPos
//
// Aufgabe: Position des Textes festlegen
//
void TTF::SetPos(float fXPos, float fYPos)
{
    m_Rect.x = static_cast<int>(fXPos);
    m_Rect.y = static_cast<int>(fYPos);

} // SetPos

// SetColor
//
// Aufgabe: Textfarbe festlegen
//
void TTF::SetColor(int R, int G, int B)
{
    m_TextColor.r = R;
    m_TextColor.g = G;
    m_TextColor.b = B;

} // SetColor

// SetBGColor
//
// Aufgabe: Hintergrundfarbe festlegen (nur bei BLENDED)
//
void TTF::SetBGColor(int R, int G, int B)
{
    m_BGColor.r = R;
    m_BGColor.g = G;
    m_BGColor.b = B;

} // SetBGColor

// SetText
//
// Aufgabe: Text festlegen
//
void TTF::SetText(string sText)
{
    m_sText = sText;

    // Bei einen leeren String w auf 0 setzen
    if (m_sText == "")
    {
        m_Rect.w = 0;
    }

} // SetText

// SetText
//
// Aufgabe: Ein int-Wert in einen String konvertieren und Text festlegen
//
void TTF::SetText(int Number)
{
    m_Text = Number;

    // int in String konvertieren
    ostringstream Text;
    Text.clear();
    Text.str("");
    Text << Number;
    
    // Text festlegen
    TTF::SetText(Text.str());
    
} // SetText

// SetType
//
// Aufgabe: Rendertyp festlegen
//
void TTF::SetType(int Type)
{
    m_Type = Type;

} // SetType

// SetSize
//
// Aufgabe: Schriftgrösse ändern
//
void TTF::SetSize(int Size)
{
    m_Size = Size;
    TTF::Load(m_sFontFilename, m_Size);

} // SetType

// Render
// 
// Aufgabe: Text auf den Screen rendern
//
void TTF::Render()
{
    TTF::RenderTextSurface();

    // Text auf den Screen rendern
    if (m_pText)
    {
        SDL_BlitSurface(m_pText, NULL, m_pScreen, &m_Rect);
    }

} // Render

// Render
//
// Aufgabe: Text in ein Surface rendern
//
void TTF::Render(SDL_Surface *pSurface)
{
    TTF::RenderTextSurface();

    // Text in ein Surface rendern
    if (m_pText)
    {
        SDL_BlitSurface(m_pText, NULL, pSurface, &m_Rect);
    }

} // Render

// RenderTextSurface
//
// Aufgabe: Das Surface des Textes erstellen
//
void TTF::RenderTextSurface()
{
    // Text wird in das Surface gerendert
    if (m_pFont)
    {
        // Surface freigeben wenn es existiert
        if (m_pText != NULL)
        {
            SDL_FreeSurface(m_pText);
            m_pText = NULL;
        }
        // Surface erstellen
        if (m_Type == TTF::SHADED)
            m_pText = (TTF_RenderText_Shaded(m_pFont, m_sText.c_str(), m_TextColor, m_BGColor));
        else if (m_Type == TTF::BLENDED)
            m_pText = (TTF_RenderText_Blended(m_pFont, m_sText.c_str(), m_TextColor));
        else
            m_pText = (TTF_RenderText_Solid(m_pFont, m_sText.c_str(), m_TextColor));
    }
    // Rect updaten
    if (m_pText != NULL)
    {
        m_Rect.w = m_pText->w;
        m_Rect.h = m_pText->h;
    }

} // RenderTextSurface

// GetIntText
//
// Aufgabe: Gibt aus einen String die Zahlen als int zurück
//
int TTF::GetIntText() 
{
    // Aufgabe: Ein String in Int konvertieren 
    istringstream Text(m_sText);
    Text >> m_Text;

    return m_Text;

} // GetIntText

9

24.09.2010, 15:06

Hallo Quin,

zu deiner Klasse sind mir ein paar Dinge eingefallen, die ich dir einfach mal so als Anregung posten möchte:

Was ist eigentlich, wenn irgendetwas fehlschlägt? Du gibst eine Fehlermeldung in der Konsole aus und beendest sofort das gesamte Framework... Zum Einen kann man dann die Konsolenausgabe schon mal nicht mehr lesen und zum Anderen hast du nicht die Möglichkeit einfach eine Warnung auszugeben und das Programm (womöglich anders) weiterlaufen zu lassen. Du solltest dir überlegen entweder Rückgabewerte wie (Erfolg, Fehlgeschlagen, ...) einzuführen oder mit Exceptions zu arbeiten, dann bist du flexibler.

Warum definierst du eTextType, wenn du es gar nicht nutzt?

Was ist eigentlich wenn ich einen Text mit transparentem Hintergrund haben möchte? Geht anscheinend nicht?!

Da könntest du also noch etwas ausbauen, falls du magst. ;)

Gruß
SaRu_

10

24.09.2010, 16:58

Quinn auch dir ein dickes Danke.
Mir geht es am Anfang aber erst mal nur darum Texte und Zahle überhaupt auszugeben ^^
Beschäftige mich grade noch ein wenig mit der Klasse von SaRu da ich ein paar Fehler in meinen Versuchen habe :pinch:

Werbeanzeige