Hi zusammen,
ich habe gerade (besser die letzten zwei Tage) versucht Heikos Spiel umzubauen. Es ist nun ein kleines Rennspiel, will heißen, ich habe die Asteroiden in Boxen auf der Straße umgewandelt und die Klasse CShot ganz rausgelassen. Außerdem habe ich alles was mit Animation zu tun hat weggelassen, da ich momentan das nicht brauch.
Da ganze läuft auch. Ich habe nur ein Problem:
die Kollision. Dabei muss ich ja prüfen ob mein Auto mit einer Box zusammengestoßen ist. Die Boxen gehe ich mittels der Liste von Heiko durch und habe also deren Koordinaten und Größe. Das Problem sind abre die DAtein des Spielers. Ich kriege einfach nicht die Höhe und Breite des PlayerSprites raus. HAbe es jetzt zwei Tage lang versucht und weiß mir nicht zu helfen.
Nun hoffe ich auf euch. Ich werde jetzt mal die relevanten Codeteile zeigen und hoffe, dass sich ein odre zwei die Mühe machen und sich des mal anschauen. Ich weiß echt keinen Rat mehr.
Danke schonmal - spacegaier
PS: Ich habe bereits zwei Rect's public setzen müssen um überhaupt dahin zu kommen. Ich weiß, dass des alles andere als sicher ist. Wenn ihr eine bessere Idee habt, wie ich sie der Kollisionserkennung übergeben kann sag's mir bitte.
sprite.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
|
#ifndef SPRITE_HPP
#define SPRITE_HPP
#include "framework.hpp"
class CSprite
{
public:
CSprite();
~CSprite();
void Load(const string sFilename);
void SetColorKey(int R, int G, int B);
void SetPos(float fXPos, float fYPos);
void Render();
SDL_Rect GetRect() {return m_Rect;}
private:
SDL_Surface *m_pScreen;
SDL_Surface *m_pImage;
SDL_Rect m_Rect;
};
#endif
|
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
|
#include "sprite.hpp"
//Load
void CSprite::Load(const string sFilename)
{
m_pImage = SDL_LoadBMP(sFilename.c_str());
if(m_pImage == NULL)
{
cout << "Fehler beim Laden von: " << sFilename.c_str();
cout << endl;
cout << "Fehlermeldung: " << SDL_GetError() << endl;
g_pFramework->Quit();
exit(1);
}
m_Rect.x = 0;
m_Rect.y = 0;
m_Rect.w = m_pImage->w;
m_Rect.h = m_pImage->h;
}
//SetPos
void CSprite::SetPos(float fXPos, float fYPos)
{
m_Rect.x = static_cast<int>(fXPos);
m_Rect.y = static_cast<int>(fYPos);
}
|
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
27
28
29
30
31
32
33
|
#ifndef PLAYER_HPP
#define PLAYER_HPP
#include <list>
#include "sprite.hpp"
class CPlayer
{
public:
CPlayer();
void Init();
void Quit();
void Render();
void Update();
void Reset();
SDL_Rect GetRect() {return m_pSpritePlayer->GetRect();}
float GetXPos() {return m_fXPos;}
float GetYPos() {return m_fYPos;}
float GetSpeed() {return m_fSpeed;}
private:
void ProcessMoving();
void CheckPosition();
CSprite *m_pSpritePlayer;
float m_fXPos;
float m_fYPos;
float m_fSpeed;
};
#endiff
|
player.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
|
#include "player.hpp"
//Init
void CPlayer::Init()
{
m_pSpritePlayer = new CSprite;
m_pSpritePlayer->Load("player_1.bmp");
m_pSpritePlayer->SetColorKey(255,0,255);
}
//Reset
void CPlayer::Reset()
{
m_fXPos = 287.0f;
m_fYPos = 370.0f;
m_fSpeed = 0.0f;
}
//Render
void CPlayer::Render()
{
m_pSpritePlayer->SetPos(m_fXPos, m_fYPos);
m_pSpritePlayer->Render();
}
|
game.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
32
33
|
#ifndef GAME_HPP
#define GAME_HPP
#include "player.hpp"
#include "box.hpp"
class CGame
{
public:
CGame();
void Init();
void Run();
void Quit();
private:
void ProcessEvents();
void SpawnBoxes();
void RenderBoxes();
void CheckCollisions();
CPlayer *m_pPlayer;
CSprite *m_pSpriteBackground_left;
CSprite *m_pSpriteBackground_right;
CSprite *m_pSpriteBox;
CSprite *m_pSpritePlayer;
CSprite *m_pSpriteBackground_midline[10];
float m_fBoxTimer;
bool m_bGameRun;
list<CBox> m_BoxList;
};
#endif
|
game.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
|
#include "game.hpp"
#include "player.hpp"
//Init
void CGame::Init()
{
m_pPlayer = new CPlayer;
m_pPlayer->Init();
m_pPlayer->Reset();
m_pSpriteBackground_left = new CSprite;
m_pSpriteBackground_left->Load("straßenstreifen_außen.bmp");
m_pSpriteBackground_left->SetPos(100.0f,0.0f);
m_pSpriteBackground_right = new CSprite;
m_pSpriteBackground_right->Load("straßenstreifen_außen.bmp");
m_pSpriteBackground_right->SetPos(675.0f,0.0f);
for(int i=0 ; i<10 ; i++)
{
m_pSpriteBackground_midline[i] = new CSprite;
m_pSpriteBackground_midline[i]->Load("straßenstreifen_innen.bmp");
m_pSpriteBackground_midline[i]->SetPos(395.0f,i * 90.0f);
}
m_pSpriteBox = new CSprite;
m_pSpriteBox->Load("box_1.bmp");
m_fBoxTimer = 0.0f;
m_bGameRun = true;
}
//SpawnBoxes
void CGame::SpawnBoxes()
{
m_fBoxTimer += g_pTimer->GetElapsed();
if(m_fBoxTimer >= 1.0f)
{
CBox Box;
int XPos = rand()%550;
XPos += 125;
Box.Init(m_pSpriteBox, static_cast<float>(XPos), - 60.0f);
m_BoxList.push_back(Box);
m_fBoxTimer = 0.0f;
}
}
//CheckCollisions
void CGame::CheckCollisions()
{
list<CBox>::iterator ItBox = m_BoxList.begin();
SDL_Rect RectBox;
while(ItBox != m_BoxList.end())
{
RectBox = ItBox->GetRect();
if(m_pPlayer->GetYPos() < RectBox.y + RectBox.h &&
m_pPlayer->GetYPos() /* + h fehlt noch*/ > RectBox.y &&
m_pPlayer->GetXPos() < RectBox.x + RectBox.w &&
m_pPlayer->GetXPos() /* + w fehlt noch*/ > RectBox.x)
{
ItBox->SetAlive(true);
}
if(ItBox->IsAlive())
{
ItBox++;
}
else
{
ItBox = m_BoxList.erase(ItBox);
}
}
}
//RenderBoxes
void CGame::RenderBoxes()
{
list<CBox>::iterator It;
for(It = m_BoxList.begin(); It != m_BoxList.end(); It++)
{
It->Render();
It->Update();
}
}
|