Autor Thema: SFML Collision  (Gelesen 170 mal)

DominikW1991

  • Mitglied
  • Beiträge: 8
  • Bewertung: 0
SFML Collision
« am: Februar 12, 2017, 21:59:16 »
Hi Leute,

nach einigem hin und her Probieren nun meine frage.

Ich binge es einfach nicht zustande, zwei sich bewegende Objekte (z.b Kreise) mit einander Kolliederen zu lassen...

Es geht zwar schon, aber entweder von der einen Seite oder von der anderen...

Beispielcode:

float K1xA1 = K1AutoKreis1.getPosition().x;
float K1x1 = K1Kreis1.getPosition().x;

Kreisspiel1.Movement_A[0] ist ein Bool. Wenn Bool falsch, dann Autokreis nach rechts, wennn richtig, dann AutoKreis nach links!

////////////
////////////

            if(Kreisspiel1.Movement_A[0] == false){
               if(K1AutoKreis1.getGlobalBounds().intersects(K1Kreis1.getGlobalBounds())){
                  if(K1xA1 > K1x1 - 30){
                     Kreisspiel1.Movement_A[0] = true;
                  }
               }
            }

            if(Kreisspiel1.Movement_A[0] == true){
               if(K1AutoKreis1.getGlobalBounds().intersects(K1Kreis1.getGlobalBounds())){
                  if(K1xA1 < K1x1 + 38){
                     Kreisspiel1.Movement_A[0] = false;
                  }
               }
            }

P.S. AutoKreis bewegt sich automatisch von links nach rechts, und von rechts nach links im Fenster...
Der K1Kreis1 lässt sich Manuell ansteuern....

Es funktioniert zwar, wenn der AutoKreis von rechts kommend (also linkslaufend) mit dem Manuellen Kreis berührt wird, geht er wieder nach rechts.
Aber es funktioniert eben nicht, wenn er von linkskommen (also rechtslaufen) mit dem Manuellen Kreis kollidiert.... ER FLIEGT EINFACH DURCH^^

Das Kuriose dabei: Wenn ich die zweite if - Bedingung weglasse, funktiert es im gegenteil, das heist Er kollidiert einwahnfrei von linkskommend...

Ich Check das einfach net, habe mehere Versuche unternommen, es ist immer dasselbe...

Bitte um Erklärung, vielen Dank schonmal  :)

K-Bal

  • Globaler Moderator
  • Mitglied
  • Beiträge: 485
  • Bewertung: 2
    • Listen!
Re: SFML Collision
« Antwort #1 am: Februar 12, 2017, 22:43:12 »
Ich finde Deinen Code, ehrlich gesagt, sehr schwer zu lesen.

Zwei Kreise lassen sich ganz leicht auf Kollision testen. Wenn die Länge der Strecke zwischen den Mittelpunkten kleiner als die Summe der Kreisradien ist, findet ein Kollision statt.

// Nicht getestet:
bool isColliding(const sf::Vector2f& m1, const float r1, const sf::Vector2f& m2, const float r2) {
    auto diff = m1-m2;
    auto rsum = r1+r2;
    if(diff.x*diff.x + diff.y*diff.y < rsum*rsum) {
        return true;
    }
    return false;
}

DominikW1991

  • Mitglied
  • Beiträge: 8
  • Bewertung: 0
Re: SFML Collision
« Antwort #2 am: Februar 13, 2017, 01:38:30 »
            if(K1AutoKreis1.getGlobalBounds().intersects(K1Kreis1.
               getGlobalBounds())){
                  /*if(K1xA1 > K1x1 - 30){
                     Kreisspiel1.Movement_A[0] = true;
                  }*/
                  if(K1xA1 < K1x1 + 30){
                     Kreisspiel1.Movement_A[0] = false;
                  }
            }


Sry ich weiss mein C++ ist noch lange nicht das beste....

Nur eine frage... das Ausgeklammerte Funktioniert wenn ich es einbinde.
Wenn ich das erste if Statement ausklammere siehe Beispiel funktioniert das 2te.

Wenn ich das erste jedoch wieder einbinde, funktioniert nur das erste....

ich sehe im Programmablauf, das die es perfekt passt.

Es funktioniert eben nur eins....

Macht mich bitte nicht gleich fertig und sagt lerne erst mal C++.

Ich lerne jeden Tag 4 - 5 Std, nur frage ich mich warum das in Gottesnahmen nicht hinhaut....

Sry und liebe Grüse Dominik :)

K-Bal

  • Globaler Moderator
  • Mitglied
  • Beiträge: 485
  • Bewertung: 2
    • Listen!
Re: SFML Collision
« Antwort #3 am: Februar 13, 2017, 22:26:42 »
Vielleicht den zweiten Ausdruck mal mit else if statt nur if probieren? So wie du es im Moment hast, können ja in einem Durchlauf beide Ausdrücke wahr werden und sich dadurch im Effekt gegenseitig aufheben.

Benutz doch am besten mal ein Debugger und schau Dir in Einzelschritten an, ob wirklich das passiert, was Du Dir vorgestellt hast.

DominikW1991

  • Mitglied
  • Beiträge: 8
  • Bewertung: 0
Re: SFML Collision
« Antwort #4 am: Februar 13, 2017, 22:52:02 »
Habe ich bereits ebenso mit else if, mehrfach probiert....

Etliche andere Lösungen habe ich bereits versucht..... :( Ok du hast recht ich probiers mal mit dem Debbuger....

Liebe Grüße Dominik  :)