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

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

1

05.05.2007, 15:54

Problem bei Textausgabe/SDL_Surface

Ich habe mir mit SDL_ttf eine Klasse "CFont" geschrieben:

Font.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef FONT_HPP
#define FONT_HPP

#include <SDL_ttf.h>

class CFont
{
public:
    void init();
    void init( const char *fontName, int size);
    void setFont( TTF_Font *font);
    void write(SDL_Surface *surface, const char *text, SDL_Color color);
    void write(const char *text, SDL_Color color);
    ~CFont();

private:
    TTF_Font *m_font;           // Font-Datei

    SDL_Surface *m_surface;     // Auf dieses Surface wird dann geschrieben...

};
#endif


Font.cpp

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
#include "Font.hpp"
#include <iostream>
#include <SDL_ttf.h>


using namespace std;

//Init: SDL_ttf laden und initialisieren, parameterlos

void CFont::init()
{
    //Initialisierung: SDL_ttf

    if(TTF_Init() == -1 )
    {
        cout << "SDL_ttf konnte nicht initialisiert werden!" << endl;
        cout << "Fehlermeldung:"<< SDL_GetError();
    }

}//Init



//Init..mit Parametern

void CFont::init( const char *fontName, int size)
{
    init(); //Normale SDL_ttf initialisierung


    //Schriftart laden

    m_font = TTF_OpenFont(fontName, size);
    if(!m_font) 
    {
        cout << "Laden der Schriftart <"<< fontName << "> fehlgeschlagen!"<< endl;
        cout << "Fehlermeldung:" << SDL_GetError() << endl;
    }

}//Init


//Destruktor

CFont::~CFont()
{
    if(m_surface != NULL)
    {
        delete(m_surface);
        m_surface = NULL;
    }
}//Desktruktor


//Write: Text auf das Surface schreiben

void CFont::write(SDL_Surface *surface, const char *text, SDL_Color color)
{

    if(!(surface=TTF_RenderText_Solid(m_font, text, color))) 
    {
        cout << "Fehler beim schreiben auf das Surface!" << endl;
        cout << "Fehlermeldung: " << SDL_GetError() << endl;
    }
}//write

void CFont::write(const char *text, SDL_Color color)
{
    write(m_surface, text, color);
}

Der Name ist vllt. etwas verwirrend, da die Klasse ja nicht wirklich ein Font repräsentiert, aber mir ist kein anderer Name eingefallen^^.

Jetzt mal zum Problem:

Soweit geht ja alles. Aber als ich den Text auch auf das Surface rendern wollte:

C-/C++-Quelltext

1
2
3
4
5
6
    SDL_Color color;
    color.r = 255;
    color.g = 0;
    color.b = 255;
    m_font.init( "ariblk.ttf", 40);
    m_font.write(g_pFramework->getScreen(), "BLUBB", color);

(ist in CGame::init), kommt einfach nichts. Es wird rein garnichts angezeigt.
Wieso? muss ich das alles als letztes zeichnen, also ans ende der run()-Methode setzen? - Hat auch nicht funktioniert.

Vielleicht hab ich auch einfach etwas bei der Klasse falsch gemacht, bin aber nach:
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fttf
vorgegangen.




Hoffe, es weiß mal wieder jemand eine Antwort.

MfG

2

05.05.2007, 18:53

Du musst deinen Font Surface noch auf den Schirm bringen

C-/C++-Quelltext

1
SDL_BlitSurface (surface, NULL, g_pFramework->getScreen(), NULL);

Für die obere linke Ecke z.b.


Mein Font Funktion sieht dann so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CFont::Write (char cText[])
{

    SDL_Color textColor = {0, 0, 0};

    SDL_Surface *NewText;

    NewText = TTF_RenderText_Solid (m_Font, cText, textColor);

    SDL_BlitSurface (NewText, NULL, g_pFramework->GetScreen (), NULL);

    SDL_FreeSurface(NewText);

}


(Hab halt noch eine für Farben bzw. coord.)

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

3

05.05.2007, 19:32

Geil :)

Kleine Zwischenfrage: Wäre es eine gute Idee, die Font-Klasse als Singleton zu implementieren? Oder eher schlecht?^^

4

05.05.2007, 20:02

Zitat von »"Schnitter"«

Geil :)

Kleine Zwischenfrage: Wäre es eine gute Idee, die Font-Klasse als Singleton zu implementieren? Oder eher schlecht?^^


Obs gut oder schlecht is kann ich dir leider nich sagen, selber Anfänger und so ;)
Ich habs gemacht, weil ich dann automatisch im Konstruktor einmal die Font lade, im Destruktor wieder freigebe und sonst von überall super einfach schreiben kann, zum debuggen oder so, wenn die kollisionsabfrage nich stimmt z.b. ^^ (zumindest is das die theorie ;))

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

5

05.05.2007, 23:19

Ich würde kein Singleton benutzen, weil wenn ich dass so richtig sehe, man pro Instanz immer nur eine Schriftart laden kann. D.h. Singleton => nur eine Schriftart - kein Singleton => meherer Schriftarten möglich
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

6

06.05.2007, 00:26

Zitat von »"Dofter"«

Ich würde kein Singleton benutzen, weil wenn ich dass so richtig sehe, man pro Instanz immer nur eine Schriftart laden kann. D.h. Singleton => nur eine Schriftart - kein Singleton => meherer Schriftarten möglich


Für den fall könnt man sich ne Funktion zum Font-wechsel schreiben X:

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

7

06.05.2007, 00:39

Nochmal was:
Ich habe 2 Ordner, einen für die Include-Dateien und einen für die lib-Dateien.

Ich habe mir den SDL_mixer heruntergeladen und die libs in den Lib-Ordner und die SDL_mixer.h in den include Ordner kopiert.

Jetzt kommt bei sämtlichen Mix_* Funktionen aber z.B. so eine Fehlermeldung:

Zitat


Sound.obj : error LNK2001: Nichtaufgeloestes externes Symbol _Mix_OpenAudio
Sound.obj : error LNK2001: Nichtaufgeloestes externes Symbol _Mix_CloseAudio
Sound.obj : error LNK2001: Nichtaufgeloestes externes Symbol _Mix_FreeChunk
Sound.obj : error LNK2001: Nichtaufgeloestes externes Symbol _Mix_PlayChannelTimed
Sound.obj : error LNK2001: Nichtaufgeloestes externes Symbol _Mix_LoadWAV_RW


Ich kann nichts damit anfangen, es sollte eigentlich funktionieren :(

8

06.05.2007, 01:52

*.dll im projekt-ordner?

/edit: bzw. die *.lib in den projekt-optionen?

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

9

06.05.2007, 09:01

Zitat


*.dll im projekt-ordner?

/edit: bzw. die *.lib in den projekt-optionen?

Ja.
Ich habe ja nur 2 gelinkte Ordner und in die habe ich alles kopiert.


EDIT: Oh gott bin ich doof -_-
Natürlich hatte ich die *.lib _nicht_ hinzugefügt -.-

Naja, das wars auch schon ;)

Trotzdem danke.

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

10

06.05.2007, 10:35

Jetzt direkt ein Problem mit dem Mixer. Ich habe eine Datei namens "explosion.wav", die ich abspielen möchte, wenn ein Schuss einen Asteroiden trifft. ich habe mir eine Klasse geschrieben mit 2 Funktionen names "playSound()", die erste:

C-/C++-Quelltext

1
2
3
4
5
6
7
void CSound::playSound(char soundFileName[])//Must be a *.wav file!

{
    // Sound laden

    m_pSound = Mix_LoadWAV( soundFileName ); 
    //Sound abspielen

    Mix_PlayChannel(-1, m_pSound, 0); 
}//playSound

habe ich erst genommen. Der sound hat aber immer hinter den Schüssen hergehinkt. Ich habe mir gedacht, dass das so ist, weil ich die Datei ja bei jedem Schuss neu laden muss. Daher noch eine 2te Funktion:

C-/C++-Quelltext

1
2
3
4
5
void CSound::playSound(Mix_Chunk* pSound)
{
    //Sound abspielen

    Mix_PlayChannel(-1, pSound, 0); 
}//playSound

Diese benutze ich jetzt. Ich habe mir auch eine Membervariable in CGame erstellt, die ich so lade(im Konstruktor):

C-/C++-Quelltext

1
    m_pExplosionSound = Mix_LoadWAV("Data/explosion.wav");


Naja, und das wird eben irgendwie nicht abgespielt.
Ich weiß nicht warum, vorher hat es funktioniert, also mit der anderen Funktion.


Hoffe, es weiß jemand Rat.


MfG

Werbeanzeige