Ich versuche zum Abschluss des Buches, das Beispiel von
Kapitel 12 von der SDL auf die SFML anzupassen.
Jedoch drängt sich mir schon beim Framework eine Frage auf:
Ist das gesamte Ding (
Framework.cpp und Framework.hpp) nich vollkommen überflüssig?
Bei der SFML muss ich mich über das Doublebuffering, meines überschaubaren Wissens nach, nicht selber kümmern.
Das setzen der Auflösung und Farbtiefe kommt mir zu umstädlich und dadurch auch recht unübersichtlich vor, könnte ich das nicht einfach in die
main packen und ab gehts?
Oder begehe ich damit eine der Todsünden des Programmierens und morgen steht eine wütende Horde Programmierer vor meiner Haustür?
Hier mal der Quellcode zum besseren Verständnis:
Framework.hpp
|
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
|
#ifndef FRAMEWORK_HPP
#define FRAMEWORK_HPP
#include <iostream>
#include "Singleton.hpp"
#include "Timer.hpp"
using namespace std;
#define g_pFramework CFramework::Get()
class CFramework : public TSingleton<CFramework>
{
public:
bool Init (int ScreenWidth, int ScreenHeight,
int ColorDepth, bool bFullscreen);
void Quit ();
void Update ();
void Clear ();
void Flip ();
bool KeyDown (int Key_ID);
SDL_Surface *GetScreen () {return m_pScreen;}
private:
SDL_Surface *m_pScreen; // Surface für den Screen
Uint8 *m_pKeystate; // Array für aktuellen Tastaturstatus
};
#endif
|
Framework.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
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
|
#include "Framework.hpp"
// Init
//
// Aufgabe: Framework initialisieren
//
bool CFramework::Init (int ScreenWidth, int ScreenHeight,
int ColorDepth, bool bFullscreen)
{
// Alle Systeme der SDL initialisieren
if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1 )
{
cout << "SDL konnte nicht initialisiert werden!" << endl;
cout << "Fehlermeldung: " << SDL_GetError () << endl;
Quit ();
return (false);
}
// Vollbild oder Fenstermodus einstellen
if (bFullscreen == true)
{
m_pScreen = SDL_SetVideoMode (ScreenWidth, ScreenHeight, ColorDepth,
SDL_HWSURFACE | SDL_DOUBLEBUF |
SDL_FULLSCREEN);
}
else
{
m_pScreen = SDL_SetVideoMode (ScreenWidth, ScreenHeight, ColorDepth,
SDL_HWSURFACE | SDL_DOUBLEBUF);
}
// Prüfen, ob alles funktioniert hat
if (m_pScreen == NULL)
{
cout << "Videomodus konnte nicht gesetzt werden!" << endl;
cout << "Fehlermeldung: " << SDL_GetError () << endl;
Quit ();
return (false);
}
// Zeiger auf internes Array für Tastaturstatus ermitteln
m_pKeystate = SDL_GetKeyState (NULL);
// Alles ging glatt, also true zurückliefern
return (true);
} // Init
// Quit
//
// Aufgabe: Framework (SDL) beenden
//
void CFramework::Quit ()
{
// SDL beenden
SDL_Quit ();
} // Quit
// Update
//
// Aufgabe: Timer und Keyboardstatus updaten
//
void CFramework::Update ()
{
// Timer updaten
g_pTimer->Update ();
// Tastaturstatus ermitteln
SDL_PumpEvents ();
} // Update
// Keydown
//
// Aufgabe: Tastendruck abfragen
//
bool CFramework::KeyDown (int Key_ID)
{
// Prüfen, ob Taste gedrückt ist
return (m_pKeystate[Key_ID] ? true : false);
} // KeyDown
// Clear
//
// Aufgabe: Buffer löschen
//
void CFramework::Clear ()
{
// Buffer (Surface) mit Hintergrundfarbe füllen
SDL_FillRect (m_pScreen, NULL,
SDL_MapRGB (m_pScreen->format, 0, 0, 0));
} // Clear
// Flip
//
// Aufgabe: Surface umschalten (flippen)
//
void CFramework::Flip ()
{
// Surface umschalten
SDL_Flip (m_pScreen);
} // Flip
|