Hallo
Ja, ich habe wieder ein Problem mit einem Vector... aber dieses mal erkläre ichs
mal genauer, undzwar habe ich einen Vektor der mit 3 Objekten gefüllt ist (diesesmal wirklich).
Erstmal der Code:
|
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
|
CPlayer.cpp:
void CPlayer::SetGravity(bool Status)
{
//Set Status
isGravity = Status;
}
void CPlayer::Movements(sf::RenderWindow &App)
{
//Falls SetGravity(true) ist, fällt der Spieler, andernfalls nicht.
if(isGravity == true)
{
//Gravitation
SCharacter.Move(0, CharacterGravity * App.GetFrameTime());
}
}
//Der Constructor wird über eine Get Methode geholt, das wie aber weiter unten im Text erwähnt nicht das Problem sein sollte
for(vector<CObject>::iterator i = ObjectList.GetVectorByID(1).begin(); i != ObjectList.GetVectorByID(1).end(); ++i)
{
if(i->IsCollisionOnTopSide(SCharacter) == true)
{
cout << "Es gab eine Collision" << endl;
//Set it on false
SetGravity(false);
}
else
{
cout << "false" << endl;
//Set it on true, if he is not on the Top of the Object
//Hier wird also die Gravitation angeschaltet so das er fällt
SetGravity(true);
}
}
|
Es sind, wie erwähnt, 3 Objekte im Vektor undzwar 0, 1 und 2. Diese exestieren auch wirklich im Vector zu 99,99%.
Deswegen müsste also die Get Funktion funktionieren und kann als Problemquelle eigentlich ausgeschlossen werden.
Trotzdem nochmal die Get Funktion:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
vector<CObject> &CObjectList::GetVectorByID(int ID)
{
if(ID == 1)
{
//Return the Vector
return Vector_ObjStone;
}
}
|
Wenn eine Collision auf der oberen Seite des Objekts stattgefunden hat wird die Gravitation für den Spieler ausgeschaltet
so das er auf dem Block stehen bleibt und hier kommen wir zum Problem, denn im Spiel wird ledeglich
nur immer beim letzten Objekt die Gravitation ausgeschaltet wenn eine Collision stattfand, bei den anderen zwei Objekten
also das 0te und 1te wird zwar in der Konsole "Es gab eine Collision" ausgegeben, was also heißt das eine Kollision stattfand aber
die Gravitation wird nicht ausgeschaltet. Also die Gravitation wird nicht ausgeschaltet aber laut Konsolen ausgabe gab
es eine Collision... was mich enorm verwirrt, weil ich einfach nicht nachvollziehen kann woran es liegt... Da ja die
Variable isGravity dann auf false gesettet wird... und dies beim letzten Objekt auch dazu führt das er nicht mehr weiter runterfällt...
Die oben im anderen Code Abschnitt aufgerufene Collisions Funktion "IsCollisionOnTopSide":
|
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
|
CObject.cpp:
bool CObject::IsCollisionOnTopSide(sf::Sprite &CollisionSprite)
{
//2 - Was there a Collision with the Top Side of the Object?
if( CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight() >= Sprite.GetPosition().y
&& CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight() <= Sprite.GetPosition().y
+ Sprite.GetSubRect().GetHeight()
||
CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight() >= Sprite.GetPosition().y
&& CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight() <= Sprite.GetPosition().y
+ Sprite.GetSubRect().GetHeight())
{
for(int x = 0; x < CollisionSprite.GetSubRect().GetWidth(); x++)
{
if( CollisionSprite.GetPosition().x + x >= Sprite.GetPosition().x
&& CollisionSprite.GetPosition().x + x <= Sprite.GetPosition().x + Sprite.GetSubRect().GetWidth())
{
//There was a Collision
return true;
}
if(x == CollisionSprite.GetSubRect().GetWidth())
{
//Reset it
x = 0;
}
}
}
else
{
//There was no Collision
return false;
}
}
|
Das war eigentlich so gut wie alles Code was mit dem Problem zusammenhengt...
Und ja, das ist wiedermal so ein komisches Problem... aber ich hoffe ich hab es
diesmal verständlich erklärt so das man mir vielleicht helfen kann.