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
|
#include "Sprite.hpp"
// Konstruktor
//
// Aufgabe: Zeiger auf Screen holen
//
CSprite::CSprite ()
{
// Zeiger auf Screen holen
m_pScreen = g_pFramework->GetScreen ();
} // Konstruktor
// Destruktor
//
// Aufgabe: Surface des Sprites freigeben
//
CSprite::~CSprite ()
{
// Surface freigeben
SDL_FreeSurface (m_pImage);
} // Destruktor
// Load
//
// Aufgabe: Einfaches, nicht animiertes Sprite laden
//
void CSprite::Load (const string sFilename)
{
// Bitmap laden
m_pImage = SDL_LoadBMP (sFilename.c_str () );
// Prüfen, ob alles glatt ging
if (m_pImage == NULL)
{
cout << "Fehler beim Laden von: " << sFilename.c_str ();
cout << endl;
cout << "Fehlermeldung: " << SDL_GetError () << endl;
// Framework herunterfahren
g_pFramework->Quit ();
// Gesamtes Spiel beenden
exit (1);
}
// Rect initialisieren
m_Rect.x = 0;
m_Rect.y = 0;
m_Rect.w = m_pImage->w;
m_Rect.h = m_pImage->h;
} // Load
// Load
//
// Aufgabe: Animiertes Sprite laden
//
void CSprite::Load (const string sFilename, int NumFrames,
int FrameWidth, int FrameHeight)
{
// Bitmap laden
Load (sFilename);
// Rect für Animationsphase initialisieren
m_NumFrames = NumFrames;
m_FrameWidth = FrameWidth;
m_FrameHeight = FrameHeight;
m_FrameRect.w = FrameWidth;
m_FrameRect.h = FrameHeight;
m_NumFramesX = m_pImage->w / m_FrameWidth;
} // Load
// SetColorKey
//
// Aufgabe: Transparente Farbe festlegen
//
void CSprite::SetColorKey (int R, int G, int B)
{
// Colorkey einstellen
SDL_SetColorKey (m_pImage, SDL_SRCCOLORKEY,
SDL_MapRGB (m_pImage->format, R, G, B) );
} // SetColorKey
// SetPos
//
// Aufgabe: Position des Sprites festlegen
//
void CSprite::SetPos (float fXPos, float fYPos)
{
// Rect updaten
m_Rect.x = static_cast<int> (fXPos);
m_Rect.y = static_cast<int> (fYPos);
} // SetPos
// Render
//
// Aufgabe: Sprite rendern (ohne Animation)
//
void CSprite::Render ()
{
// Sprite rendern
SDL_BlitSurface (m_pImage, NULL, m_pScreen, &m_Rect);
} // Render
// Render
//
// Aufgabe: Ausschnitt des Sprites rendern (Animationsphase)
//
void CSprite::Render (float fFrameNumber)
{
// Ausschnitt der aktuellen Animationsphase berechnen
//
// Spalte berechnen
int Column = static_cast<int>(fFrameNumber)%m_NumFramesX;
// Zeile berechnen
int Row = static_cast<int>(fFrameNumber)/m_NumFramesX;
// Rect berechnen
m_FrameRect.x = Column * m_FrameWidth;
m_FrameRect.y = Row * m_FrameHeight;
// Ausschnitt rendern
SDL_BlitSurface (m_pImage, &m_FrameRect, m_pScreen, &m_Rect);
} // Render
|