Erstmals danke, für die schnellen Antworten.
Hier sind die Dateien bzw. Teile aus Dateien, die mit dem Rect zusammen hängen. Eine Information hab ich vergessen zu erwähnen
Die Collisions-Funktion habe ich vorerst rausgenommen, um zu sehen, ob erstmal alles andere funktioniert.
Hier die Sprite.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
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
|
hier die Anwendung:
Player.cpp
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void Player::Init ()
{
m_Rect.x = static_cast<int>(m_fXPos);
m_Rect.y = static_cast<int>(m_fYPos);
m_Rect.w = m_pSpritePlayer->GetRect ().w;
m_Rect.h = m_pSpritePlayer->GetRect ().h;
m_pSpritePlayer = new CSprite;
m_pSpritePlayer->Load ("Data/Schläger.jpg");
m_pSpritePlayer->SetColorKey (255, 0, 255);
}
|
Player.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
|
#include "Sprite.hpp"
class Player
{
public:
Player ();
void Init ();
void Quit ();
void Render ();
void Update ();
void Reset ();
SDL_Rect GetRect () {return m_Rect;}
private:
void Move ();
void Position ();
CSprite *m_pSpritePlayer;
float m_fXPos;
float m_fYPos;
SDL_Rect m_Rect;
};
|
Die Dateien Ball.cpp und Ball.hpp, die den Kreis programmieren verlaufen so ähnlich:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void Ball::Init (CSprite *pSpriteBall, float fXPos, float fYPos)
{
m_pSpriteBall = pSpriteBall;
m_fXPos = fXPos;
m_fYPos = fYPos;
m_Rect.x = static_cast<int>(fXPos);
m_Rect.y = static_cast<int>(fYPos);
m_Rect.w = pSpriteBall->GetRect ().w;
m_Rect.h = pSpriteBall->GetRect ().h;
m_bIsAlive = true;
}
|
Edit: Noch eine Zusatz-Information. Wenn ich die Rect-Koordinaten vom Spieler weg mache, funktioniert wieder fast alles.