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

04.06.2012, 18:32

SDL, C++, 2D Ball Collision und Abprallen

Hey Forumnutzer,
ich bin neu hier und auch neu im Bereich der Spieleprogrammierung.
Ich möchte Erfharungen im Erstellen von Spielen sammeln und habe daher mit einem Klon von Pong begonnen.
Ich habe auch schon ein lauffähiges Programm, allerdings scheitere ich momentan an dem letzten Schritt der Collisionserkennung Zwischen der Kugel und Anderen Objekten, wie dem Schläger.
Alle Objekte werden vektoriell Dargestellt und bewegliche besitzen einen Richtungsvektor für Bewegung. Die Kugel besitzt eine Viereckige Bounding Box.

Ich bin mit meiner Methode in der Lage eine Collision zu erkennen und auch das Abprallen klappt in 90% der Fälle, allerdings habe ich das Problem, wenn die Kugel genau auf eine Ecke, des anderen Objekts tirfft, dann wird keine Collision erkannt und die Kugel fiegt in das Objekt.
Hier mein Code...(Changedirection invertiert einen Wert der Richtungsvektors)...

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
void CGame::CheckCollision()
{  
    if ( ObjektList.empty() != true)
    {
        for ( ListIter = ObjektList.begin() ; ListIter != ObjektList.end() ; ListIter++ )
        {
            if ( (*ListIter) != pBall && (*(*ListIter)->GetSprite()).Collision(pRect2) == true )
            {

                //NEU

                //pBall->ChangeDirection( (Ball.X + Ball.W ) - ( (*ListIter).X + (*ListIter)W ), 
                //                      (Ball.Y + Ball.He ) - ( (*ListIter).Y + (*ListIter).H) );
    
                
                /// ALT
                if ( Ball.y + Ball.h > ((*ListIter).Y && Ball.y < (*ListIter).h + (*ListIter).Y )
                {
                    pBall->ChangeDirection('x');
                }

                if (Ball.x + Ball.w > ((*ListIter).X && Ball.x < (*ListIter).w + (*ListIter).X )
                {
                    pBall->ChangeDirection('y');
                }
            }
        }
    }
}


Ich konnte leider nirgendwo anders eine (für mich verständliche :) ) Lösung für mein spezielles Problem finden.


Im Voraus schonmal Danke für eure Hilfe

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

2

07.06.2012, 14:40

Warum hat die Kugel eine viereckige Bounding-Box?
Wäre nicht eine Runde Bounding-Box für eine Kugel angebrachter?
Damit lässt sich viel leichter eine Kollision mit anderen Objekten berechnen.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)