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

26.02.2015, 16:14

Problem mit der Kollision

Hallo,

Ich versuche zur Zeit eine Box-Box Kollision zu erstellen wo mir immer angegeben wird von welcher des zu Kollidierenden Objekt eine Kollision erzeugt. Also wenn der Spieler jetzt von rechts auf ein Sprite zu kommt dann soll er ja in positiver Richtung der X-Koordinate gebremst werden. Wenn der Spieler aber von Links kommt soll er natürlich entgegen(also negativ) der X-Koordinate gebremst werden, und wenn er von oben kommt (z.B wenn der Spieler von einem höheren Objekt runterfällt) dann soll er ja entgegen der Y-Koordinate gebremst werden. Ich hoffe ihr versteht was ich meine. Also die eigentliche Kollisionsabfrage ist nicht das Problem, denn ich arbeite mit der SFML und C++. Und weil es da ja schon eine Funktion zur Überlappung von sprites gibt, verwende ich diese. Mein Problem ist es jetzte halt nur zu prüfen von welcher Seite der Spieler das Sprite berührt hat. Und da weis ich leider nicht weiter. Ich saß jetzt schon Stunden dran, doch leider ohne Erfolg. Auch im Internet finde ich nichts dazu, nur zur eigentlichen Box-Box Kollision finde ich was. Hier mal 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
Collison::SITES Collison::BoxToBox(std::vector<sf::Sprite>& tiles, sf::Sprite object)
{
    for(auto &it : tiles)
    {
        //Prüfen ob der Player mit einem Sprite interagiert.
        if(object.getGlobalBounds().intersects(it.getGlobalBounds()))
        {
            //Prüfen ob der Player mit der rechten Seite an einem Sprite kollidiert.
            if(object.getPosition().x + object.getGlobalBounds().width > it.getPosition().x &&
                object.getPosition().x < it.getPosition().x)
            {
                return SITES::RIGHT;
            }
            //Prüfen ob der Player mit der linken Seite an einem Sprite kollidiert.
            else if(object.getPosition().x < it.getPosition().x + it.getGlobalBounds().width &&
                    object.getPosition().x + object.getGlobalBounds().width > it.getPosition().x + it.getGlobalBounds().width)
            {
                return SITES::LEFT;
            }
            //Prüfen ob der Player mit der unteren Seite an einem Sprite kollidiert.
            else if(object.getPosition().y + object.getGlobalBounds().height > it.getPosition().y &&
                    object.getPosition().y < it.getPosition().y )
            { 
                return SITES::DOWN;
            }
            //Prüfen ob der Player mit der oberen Seite an einem Sprite kollidiert.
            else if(object.getPosition().y < it.getPosition().y + it.getGlobalBounds().height &&
                    object.getPosition().y + object.getGlobalBounds().height > it.getPosition().y + it.getGlobalBounds().height)
            {
                return SITES::TOP;
            }
        }

        //std::cout << object.getPosition().y + object.getGlobalBounds().height << " | " << it.getPosition().y << "\n";
    }
}


Ich hoffe mal das mir jemand bei diesem Problem helfen kann, wahrscheinlich ist die Lösung wieder zu einfach für mich :thumbsup:


MfG
Sceiwen

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sceiwen« (26.02.2015, 18:06)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

26.02.2015, 17:02

Pack bitte erstmal deinen Code in Code Tags, und rück ihn am besten noch ein.

Eine simple Lösung wäre es jetzt die Bewegungsrichtung zu nehmen, also wenn Links gedrückt wird kommt er von rechts auf das Rect zu, usw.
Evt. hast du die Bewegungsrichtung auch in deiner Player Klasse.

Die andere Möglichkeit ist es zu gucken ob die X bzw. Y Koordinate des Spielers größer/kleiner ist als die Mitte des Rects.
Auch sehr einfach eigentlich.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Lösung A
if(!kollidiert)
    return keineSeite;

if(Player.bewegungsrichtung.x > 0)
    return Rechts;

// usw...

// Lösung B
if(!kollidiert)
    return keineSeite;

zentrum = rect.position+rect.größe/2;

if(player.position.x > zentrum.x)
    return RechtsDavon;

if(player.position.x < zentrum.x)
    return LinksDavon;

// usw...

3

27.02.2015, 22:46

Pack bitte erstmal deinen Code in Code Tags, und rück ihn am besten noch ein.

Eine simple Lösung wäre es jetzt die Bewegungsrichtung zu nehmen, also wenn Links gedrückt wird kommt er von rechts auf das Rect zu, usw.
Evt. hast du die Bewegungsrichtung auch in deiner Player Klasse.

Die andere Möglichkeit ist es zu gucken ob die X bzw. Y Koordinate des Spielers größer/kleiner ist als die Mitte des Rects.
Auch sehr einfach eigentlich.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Lösung A
if(!kollidiert)
    return keineSeite;

if(Player.bewegungsrichtung.x > 0)
    return Rechts;

// usw...

// Lösung B
if(!kollidiert)
    return keineSeite;

zentrum = rect.position+rect.größe/2;

if(player.position.x > zentrum.x)
    return RechtsDavon;

if(player.position.x < zentrum.x)
    return LinksDavon;

// usw...
Lösung B bringt in dem Falle nichts. Denn wenn der Compiler in die Funktion eintritt dann erkennt er immer Rechts als Kollision. Das liegt daran dass das auch die erste Abfrage ist. Irgendwie löst dass leider nicht mein Problem ;(

4

28.02.2015, 01:24

Ohne die Information, in welche Richtung sich das Objekt bewegt hat SODASS daraufhin eine Kollision stattfindet, kannst du das nicht sinnvoll machen.
Speicher eine aktuelle Geschwindigkeit (Richtung * Faktor) und bremse entlang der negierten Richtung.
Wenn du das Konzept der Geschwindigkeit nicht übernehmen möchtest, wirst du zwingend die Informationen zur vorangehenden Bewegung speichern müssen (Vektor).
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

5

28.02.2015, 14:19

Ohne die Information, in welche Richtung sich das Objekt bewegt hat SODASS daraufhin eine Kollision stattfindet, kannst du das nicht sinnvoll machen.
Speicher eine aktuelle Geschwindigkeit (Richtung * Faktor) und bremse entlang der negierten Richtung.
Wenn du das Konzept der Geschwindigkeit nicht übernehmen möchtest, wirst du zwingend die Informationen zur vorangehenden Bewegung speichern müssen (Vektor).
Dann muss ich logischer Weise immer die Bewegungsrichtung speichern, denn ich brauche sie ja nur dann, wenn eine Kollision stattfindet. Ich denke mal dass das kein Problem sein wird, vielen Dank :)

Werbeanzeige