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

11

11.03.2008, 16:59

Ich hätte das jetzt so gelöst:

C-/C++-Quelltext

1
2
char Buffer[120];
sprintf_s (m_Score, "Geld:  %i", m_Points);

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

12

11.03.2008, 17:05

In C++ bietet sich doch ein stringstream an:

C-/C++-Quelltext

1
2
3
4
5
6
#include <sstream>
...
std::stringstream sout;
sout << "Punkte: " << m_Points;
// z.B. Ausgabe des erzeugten Strings:

std::cout << sout.str() << std::endl;

Ist IMHO die wesentlich sauberere Lösung.

13

11.03.2008, 17:23

Init und Quit ... das ist eigtl. genau das was der Konstruktor und Destruktor leistet ... weiß nicht warum David und glaube ich auch Heiko das in ihren Büchern schreiben ... blöd!

und einmal Templates:

C-/C++-Quelltext

1
2
template <typename pointer_type>
void safe_delete(pointer_type*& ptr) { delete ptr; ptr = NULL; }


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
CGame::CGame()
    : m_pScreen(new SDL_Surface), m_Points(0)
{
    ::TTF_Init();
    m_pFont = ::TTF_OpenFont("Data/comic.ttf",18);
}

CGame::~CGame()
{
    safe_delete(m_pScreen);
    ::TTF_CloseFont(m_pFont);
    ::TTF_Quit();
}

void CGame::CheckPoints(const unsigned int points)
{
    char buffer[128];
    std::snprintf(buffer, 128, "Punkte %d", points);
    m_pSText = ::TTF_RenderText_Solid(m_pFont, buffer, clrBlack); 

    ::SDL_BlitSurface(m_pSText, NULL, m_pScreen, &dstTextKoordinaten);
}
wobei ich nicht weiß, wie man bei SDL sich um die Speicherfreigabe usw. kümmern muss.
Aber eins weiß ich. Du erzeugst speicher löcher. Und davon viele!

C-/C++-Quelltext

1
m_pSText = TTF_RenderText_Solid
... vorher ist aber m_pSText durch new SDL_Surface bereits ein zeiger auf einen Speicherbereich. Wenn du diesen Zeiger umlenkst, kannst du den alten Bereich nichtmehr löschen! (Was du eh nicht machst ;) )

Dann ist das mischen von SDL_FreeSurface und delete bestimmt falsch. SDL_FreeSurface arbeitet wahrscheinlich mit C-Funktionen. Das new SDL_Surface ist auch falsch. Das wird im Fall von m_pSText ja in deiner CheckPoints zugewiesen und im Falle von m_pScreen musst du selber mal gucken wo es zugewiesen wird.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

14

11.03.2008, 19:56

Danke für die Antworten :D

Jetzt hab ich große auswahl, ich teste einfach mal alles. :D

@Deviloper:
Danke für die Hinweise mit den Speicherlöchern.
Was bedeuten die vielen Doppelpunkte die du vor den Funktionsnamen verwendest?



ich meld mich wenns klappt (oder auch nicht)

mfg Gon

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

15

12.03.2008, 16:24

also bei dem von Deviloper kommen diese Meldungen:

Quellcode

1
c:\dokumente und einstellungen\eigene dateien\projekte\projekte\möp\game.cpp(736) : error C2039: 'snprintf' : Ist kein Element von 'std'


und

Quellcode

1
c:\dokumente und einstellungen\eigene dateien\projekte\projekte\möp\game.cpp(736) : error C2065: 'snprintf' : nichtdeklarierter Bezeichner


Wie muss man das deklarieren?

Frage: m_pScreen wird schon in der Framwork klasse initialisiert und so, und ich nehm auch den screen, weil des der ist, wo man das spiel sieht,
muss ich dann in der GAme klasse nochmal den initialisieren?
und was ist mit dem safe_delete?

Bei dem von Viscil kommt die meldung dass er sprintf_s nicht kennt.
was muss ich bei viscils version hier angeben, wo "dein text" steht?
Buffer oder m_Score?

Quellcode

1
m_pSText = TTF_RenderText_Solid(m_pFont, "Dein Text", clrBlack);


zu s.seegels version:
wie wird da dann SDL_ttf verwendet?


Danke im voraus,

mfg Gon

16

12.03.2008, 17:33

S.Seegels Version mit SDL_ttf:

C-/C++-Quelltext

1
2
3
4
5
6
#include <sstream>
...
std::stringstream sout;
sout << "Punkte: " << m_Points;

textSurface = TTF_RenderText_Solid(font, sout.str().c_str(), textColor);

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

17

12.03.2008, 19:22

Vielen Dank, endlich gehts :lol:

18

12.03.2008, 19:28

Ja du kannst m_pScreen ja initialisieren wo du willst, aber pass darauf auf, das du keine Löscher machst!

http://www.cppreference.com/stdio/sprintf.html => C Version ist nen bissel schneller als die zwar sicherere C++ Version std::stringstream.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

19

12.03.2008, 20:52

Wenn schon, dann bitte snprintf(). Es bleibt aber die Beschränkung, dass man bereits vorher wissen muss, wie lange der string maximal werden kann. Was wiederum voraussetzt, dass man ganz allgemein ne Idee davon hat, was man tut ...

Werbeanzeige