Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.04.2011, 11:59

Fehlerhafte Kollisionserkennung

Hallo Spieleprogrammierer.de,

mein Problem ist wie der Topic schon sagt, dass ein Teil der Kollisionserkennungen fehlerhaft sind oder gar nicht funktionieren. Ich bin echt am Verzweiflen ich hab jetzt 3 Blätter voller Skizzen und Auswertungen der Kollisionen aber irgendwie scheint mein Code trotzdem noch nicht zu funktionieren:
Code: http://pastebin.com/scT7yn87

Danke im Voraus
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ninjasturm« (21.04.2011, 12:07)


2

21.04.2011, 13:06

Wenn das Wörtchen Wenn nicht wär'... Das sind ja ne ganze Menge if-Bedingungen... und alle ineinander verschachtelt. Ich würde an deiner Stelle mal schauen ob du die nich etwas reduzieren kannst. So riesengroße, lange if-Blöcke sind echt nicht sonderlich schön und meist sehr unangenehm zu lesen.

Was macht eigentlich das hier in der Kollisionsabfrage bzw. warum wird es z.B. zu der rechten Seite des Sprites hinzuaddiert?

C-/C++-Quelltext

1
this->m_Knight[i].getMovingDirection().x


Vielleicht kannst du uns mal nur den relevanten Quellcode hier posten und genau beschreiben was nicht funktioniert. Kommt es zu gar keiner Kollision oder nur in manchen Fällen...

Gruß
SaRu_

3

21.04.2011, 13:06

Hmm, soweit ich das sehe müsste zumindest der Ansatz stimmen. Was genau läuft denn schief?
Außerdem glaube ich, dass du das viel zu kompliziert löst. Du schreibst dir einfach eine Funktion, die die Kollision von 2 Rects testet und gehst dann (wie du es schon gemacht hast) Ritter für Ritter durch und testest mit jedem anderen Ritter

MfG

4

21.04.2011, 14:10

Ich addiere zu jedem Sprite die Bewegungsrichtung damit ich testen kann falls ich den Ritter bewegen würde ob dann eine Kollision wäre.

Wie würdest du die Kollisionsabfrage von 2 Rects schreiben?
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ninjasturm« (21.04.2011, 14:16)


5

21.04.2011, 14:16

Und du kannst nicht erkennen wann es geht und wann nicht?
Probier doch mal meine Variante

6

21.04.2011, 15:02

Hab mal diesen Code verwendet um Kollisionen zu erkennen: http://www.sfml-dev.org/wiki/en/sources/…ision_detection.
Damit funktioniert die Kollisionserkennung(Circle) perfekt allerdings kleben die Objekte dann irgendwie aneinander.
Hab dass Problem mit dem aneinander festkleben gelöst in dem ich sie dann einfach an der andere Achse weiter bewege bis sie am anderen Object vorbei sind.
Dass funktioniert aber irgendwie nur auf die dauer da der Fehler trotzdem hin und wieder aufritt.
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
37
38
39
40
41
42
// Knight auf X - Achse bewegen
bool bCollisionX = false;
for (int x = 0; x < 49; x++)
{
if (i != x)
{
if (this->m_Knight[x].IsAlive())
{
sf::Sprite Sprite(this->m_Knight[i].getSprite());
Sprite.SetPosition(Sprite.GetPosition().x + this->m_Knight[i].getMovingDirection().x, Sprite.GetPosition().y);
if (Collision::CircleTest(Sprite, this->m_Knight[x].getSprite()))
{
bCollisionX = true;
}
}
}
}
if (!bCollisionX)
{
this->m_Knight[i].MoveX(timeSinceLastFrame.GetElapsedTime());
}
// Knight auf Y - Achse bewegen
bool bCollisionY = false;
for (int y = 0; y < 49; y++)
{
if (i != y)
{
if (this->m_Knight[y].IsAlive())
{
sf::Sprite Sprite(this->m_Knight[i].getSprite());
Sprite.SetPosition(Sprite.GetPosition().x, Sprite.GetPosition().y + this->m_Knight[i].getMovingDirection().y);
if (Collision::CircleTest(Sprite, this->m_Knight[y].getSprite()))
{
bCollisionY = true;
}
}
}
}
if (!bCollisionY)
{
this->m_Knight[i].MoveY(timeSinceLastFrame.GetElapsedTime());
}
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Ninjasturm« (21.04.2011, 15:51)


7

21.04.2011, 15:44

allerdings kleben die Objekte dann irgendwie aneinander.

Das liegt vielleicht daran, dass sich die Objekte weiterhin aufeinander zu bewegen, sodass es permanent zu einer Kollision kommt und die Objekte sich natürlich nicht voneinander wegbewegen. Du musst entscheiden was du machen willst, wenn die Objekte kollidieren. Du könntest z.B. die Bewegungsrichtung umkehren um ein Abprallen zu bekommen.

Gruß
SaRu_

Werbeanzeige