Hallo miteinander
Ich habe erneut ein Problem mit der Kollision, dachte ich hätte es verstanden aber anscheinend noch nicht ganz.
An meinem aktuellen Projekt, ein Ping Pong Spiel hat der Spieler einen Balken am unteren Bildschirmrand von links nach rechts zu bewegen.
Ein Ball wird in der Mitte des Bildschirmes geladen und erhält zufällige Velocity für X und Y. Das Ziel ist es nun als Spieler mithilfe des Balkens den Ball
in die Richtung der Klötze zu zielen um das Level zu beenden.
Nun die Kollision SpielerBall hat zu einem früheren Zeitpunkt mal funktioniert. Mittlerweile ist dies nicht mehr der Fall. Geändert hat sich, dass ich mit einer *.xml Datei
nun die ganze Welt inklusive alle Objekte lade. Dies funktioniert auch problemlos. Im CollisionsManager verwalte ich alle Kollisionen. Aktuell habe ich nur die folgende Kollision:
|
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
|
void CollisionManager::checkPlayerBallCollision (const vector<GameObject*> &objects)
{
SDL_Rect* pRect1 = new SDL_Rect();
SDL_Rect* pRect2 = new SDL_Rect();
for(int i = 0; i < objects.size(); i++)
{
if(objects[i]->getTextureID() == "ball")
{
pRect1->x = objects[i]->getPosition().getX();
pRect1->y = objects[i]->getPosition().getY();
pRect1->w = objects[i]->getWidth();
pRect1->h = objects[i]->getHeight();
}
if(objects[i]->getTextureID() == "player")
{
pRect2->x = objects[i]->getPosition().getX();
pRect2->y = objects[i]->getPosition().getY();
pRect2->w = objects[i]->getWidth();
pRect2->h = objects[i]->getHeight();
}
}
if(RectRect(pRect1, pRect2) == true)
{
cout << "Collision detected" << endl;
Ball().collision();
}
delete pRect1;
delete pRect2;
}
|
Anhand dieser Funktion werden mittels dem Vector alle GameObjekte angesteuert. Nachdem 2x Rect erstellt wurden, wird mit einer Schleife und mithilfe der getTextureID die gewünschten Objekte identifiziert und Werte für die Rects zugeordnet. Dies funktioniert auch, zumindest wenn ich einen Breakpoint vor der Funktion if(RectRect...) setze sehe ich dass alle Werte zugeteilt wurden und auch stimmen. Nun folgt die eigentliche Kollisionsabfrage, welche in einer anderen Datei namens Collision.hpp liegt:
|
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
|
bool RectRect(SDL_Rect* a, SDL_Rect* b)
{
//The sides of the rectangles
int leftA, leftB;
int rightA, rightB;
int topA, topB;
int bottomA, bottomB;
//Calculate the sides of rect A
leftA = a->x;
rightA = a->x + a->w;
topA = a->y;
bottomA = a->y + a->h;
//Calculate the sides of rect B
leftB = b->x;
rightB = b->x + b->w;
topB = b->y;
bottomB = b->y + b->h;
//If any of the sides from A are outside of B
if( bottomA <= topB )
{
return false;
}
if( topA >= bottomB )
{
return false;
}
if( rightA <= leftB )
{
return false;
}
if( leftA >= rightB )
{
return false;
}
//If none of the sides from A are outside B
return true;
}
|
Auch hier sehe ich wenn ich im Spiel bin, dass sobald der Ball über dem Spieler ist, dass in der Konsole "Collision detected" angezeigt wird und zwar mindestens 20x. Die letzte Funktion welche nun bei der Kollision aufgerufen wird ist Ball().collision();
|
C-/C++-Quelltext
|
1
2
3
4
|
void Ball::collision()
{
m_velocity.setY(m_velocity.getY() * (-1));
}
|
Zuletzt werden in der GameObjekt Datei ständig nach Kollision gefragt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
void ObjectLayer::update()
{
for (int i = 0; i < m_gameObjects.size(); i++)
{
m_gameObjects[i]->update();
g_pCollisionManager->checkPlayerBallCollision((const vector<GameObject*>&)m_gameObjects);
}
}
|
Ich verstehe es einfach nicht, aber die Kollision funktioniert nicht mehr ... der Ball geht einfach durch den Spieler durch und gar nichts passiert obwohl in der Konsole eine Kollision delektiert wurde!
Danke im Voraus!
Eric