Hallo liebe community,
ich habe nun das Buch "C++ für Spieleprogrammierer" durch und bin jetzt dabei das SDL-Game aus dem letzten Kapitel zu erweitern.
Ich habe dazu schon ein Hauptmenü gestaltet über das man unter anderem zum Highscore kommt.
Die aktuelle Punktzahl im Spiel sowie den Highscore habe ich auch schon integriert, die Ausgabe der Werte folgt aber noch (zu Testzwecken) über die Win32-Konsole.
Jetzt möchte ich die Ausgabe natürlich im Fenster machen und bin dann auf SDL_ttf gestoßen, dass ich mittlerweile auch eingebettet habe und nun versuche eine Textausgabe beim Highscore hinzubekommen. Dazu folgende Quellcode-Ausschnitte, die zeigen, wie ich mir das gedacht habe:
Die Klasse CTff:
|
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
|
#include "SDL.h"
#include "SDL_ttf.h"
#include <string>
#include <iostream>
using namespace std;
class CTff
{
public:
//Instanzen
SDL_Surface *message;
TTF_Font *font;
bool init()
{
//Initialisierung
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
//Fehlermeldung
cout << "Fehler bei SDL_Init" << endl;
cin.get();
return false;
}
//SDL_ttf initialisieren
if( TTF_Init() == -1 )
{
//Fehlermeldung
cout << "Fehler bei Tff_Init" << endl;
cin.get();
return false;
}
//Alles gut gegangen
return true;
}
bool load_files()
{
//Font öffnen
font = TTF_OpenFont( "Data/FreeSans.ttf", 30);
if( font == NULL )
{
//Fehlermeldung
cout << "Fehler bei Font" << endl;
cin.get();
return false;
}
//Alles gut gegangen
return true;
}
void clean_up()
{
//Freigeben
SDL_FreeSurface(message);
//Font schließen
TTF_CloseFont(font);
//Quit SDL_ttf
TTF_Quit();
}
};
|
Highscore.cpp-Auschnitt (Hier soll die Textausgabe erfolgen):
|
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
|
//Run
//Aufgabe: Hauptschleife des Highscores
int CHighscore::Run()
{
//Hauptschleife des Spiels durchlaufen
while (m_bHighscoreRun == true)
{
//Text laden und ausgeben
SDL_Color textColor = {0, 0, 0 };
Tff.message = NULL;
Tff.font = NULL;
//Initialisieren
if (Tff.init() == false )
{
std::cerr << "Konnte SDL_ttf nicht initialisieren! Fehler: " << TTF_GetError() << std::endl;
return 1;
}
//Dateien laden
if(Tff.load_files() == false )
{
std::cerr << "Konnte Dateien nicht laden! Fehler: " << TTF_GetError() << std::endl;
return 1;
}
//Text renden
Tff.message = TTF_RenderText_Solid( Tff.font, "Wo ist mein Text?", textColor);
//Text Position
SDL_Rect textPosition;
textPosition.x = 300;
textPosition.y = 300;
SDL_BlitSurface(Tff.message, 0, Framework.m_pScreen, &textPosition);
if( Tff.message == NULL )
{
//Fehlermeldung
cout << "Fehler bei Render" << endl;
cin.get();
return 1;
}
//Events bearbeiten
ProcessEvents();
//Freigeben
Tff.clean_up();
//Framework updaten und Buffer löschen
g_pFramework->Update();
g_pFramework->Clear();
//Bilder rendern
m_pSpriteBackground->Render();
//Buffer flippen
g_pFramework->Flip();
}
}
|
Jetzt habe ich folgende Probleme:
1. Starte ich im "Release"-Modus funktioniert das Menü, das Spiel und ich komm zum Bildschirm wo die Textausgabe stehen sollte. Jedoch sieht man dort nur den Hintergrund aber kein Text! Dazu bekomme ich
nur gelegentlich und auch nur ca. 5-10sec nachdem ich im Highscoremenü bin, die Rückmeldung "Fehler bei Font" (Fehlermeldung habe ich ja selber eingebaut)
2. Starte ich im "Debug"-Modus, startet das Spiel erst gar nicht und ich bekomm folgende
Debug-Fehlermeldung:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
1>d:\projekte\sdl_game2\sdl_game2\start.cpp(128): warning C4715: "CStart::Run": Nicht alle Steuerelementpfade geben einen Wert zurück.
1>CGame.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp___CrtDbgReportW" in Funktion ""public: class std::_List_const_iterator<class std::_List_val<class CAsteroid,class std::allocator<class CAsteroid> > > & __thiscall std::_List_const_iterator<class std::_List_val<class CAsteroid,class std::allocator<class CAsteroid> > >::operator++(void)" (??E?$_List_const_iterator@V?$_List_val@VCAsteroid@@V?$allocator@VCAsteroid@@@std@@@std@@@std@@QAEAAV01@XZ)".
1>CHighscore.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp___CrtDbgReportW".
1>CPlayer.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp___CrtDbgReportW".
1>CHighscore.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_TTF_RenderText_Solid" in Funktion ""public: int __thiscall CHighscore::Run(void)" (?Run@CHighscore@@QAEHXZ)".
1>CHighscore.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_TTF_Init" in Funktion ""public: bool __thiscall CTff::init(void)" (?init@CTff@@QAE_NXZ)".
1>CHighscore.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_TTF_OpenFont" in Funktion ""public: bool __thiscall CTff::load_files(void)" (?load_files@CTff@@QAE_NXZ)".
1>CHighscore.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_TTF_Quit" in Funktion ""public: void __thiscall CTff::clean_up(void)" (?clean_up@CTff@@QAEXXZ)".
1>CHighscore.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_TTF_CloseFont" in Funktion ""public: void __thiscall CTff::clean_up(void)" (?clean_up@CTff@@QAEXXZ)".
1>D:\Projekte\SDL_Game2\Debug\SDL_Game2.exe : fatal error LNK1120: 6 nicht aufgelöste externe Verweise.
|
Die Debug-meldung deutet ja darauf hin, dass irgendwas mit dem Linker nicht funktioniert, doch warum geht es dann im Release-Modus?
Und warum bekomm ich keine Textausgabe im Release-Modus?
Könnt ihr mir weiterhelfen?
Gruß theBeGinner