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

24.09.2007, 22:21

Kollisionserkennung

Hallo,
kann mir jemand sagen, was ich bei dieser Kollisionserkennung falsch gemacht habe? ich probier schon seit stunden run und bekomms einfach net hin (ich weiß aber immerhin, dass das ziehmlich schlechter Codestil, 0 Objektorientiert ist^^ Das soll nur ein Test sein obs funktioniert)

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
43
44
45
46
47
48
49
50
51
bool TestCollision(int Rect1[4], int Rect2[4])
{
    bool CollisionX = TestCollisionX(Rect1,Rect2);
    bool CollisionY = TestCollisionY(Rect1,Rect2);
    if((CollisionX == true)&&(CollisionY == true))
        return true;
    else
        return false;
}

bool TestCollisionX(int Rect1[4], int Rect2[4])
{
    for(int y1 = Rect1[1]; y1 >= Rect1[3]; y1++)
    {
        for(int x1 = Rect1[0]; x1 >= Rect1[2]; x1 += Rect1[2] - Rect1[0])
        {
            for(int y2 = Rect2[1]; y2 >= Rect2[3]; y2++)
            {
                for(int x2 = Rect2[0]; x2 >= Rect2[2]; x2 += Rect2[2] - Rect2[0])
                {
                    if((x1 == x2)&&(y1 == y2))
                    {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

bool TestCollisionY(int Rect1[4], int Rect2[4])
{
    for(int y1 = Rect1[0]; y1 >= Rect1[2]; y1++)
    {
        for(int x1 = Rect1[1]; x1 >= Rect1[3]; x1 += Rect1[3] - Rect1[1])
        {
            for(int y2 = Rect2[0]; y2 >= Rect2[2]; y2++)
            {
                for(int x2 = Rect2[1]; x2 >= Rect2[3]; x2 += Rect2[3] - Rect2[1])
                {
                    if((x1 == x2)&&(y1 == y2))
                    {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}


Kann mir jemand weiterhelfen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

24.09.2007, 22:32

Nicht objektorientiert ist nicht gleich ein schlechter Codestil. Was funktioniert denn eigentlich nicht? Dieser Schleifenhaufen ließe sich mit sicherheit noch vereinfachen!
@D13_Dreinig

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

24.09.2007, 22:43

OMG!
Was soll das denn? Sry die harten Worte! Aber ich geh mal davon aus, dass du einfach testen Willst, ob zwei Rechtecke kollidieren! Nur verstehe ich nicht ganz wie man Rechtecke im 2D-Raum mit nur einer Koordinate beschreiben will??

Wäre es so nicht einfacher: (??)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
template <typename T>
bool SubTest(const T& min1, const T& max1, const T& min2, const T& max2)
{
    return (min1 <= min2 && max1 >= min2) || (min1 <= max2 && max1 >= max2);
}

//Jeweils die zwei extreme (Minimum und maximum)

bool TestCollision(vector2D vMin1, vector2D vMax1, vector2D vMin2, vector2D vMax2)
{
    return SubTest(vMin1.x, vMax1.x, vMin2.x, vMax2.x) && SubTest(vMin1.y, vMax1.y, vMin2.y, vMax2.y);
}


edit:
Zur Erklärung! bin jetzt davon ausgegangen, dass die beiden Rechtecke AA sind... Sonst musst du sie halt noch entsprechend transformieren...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

4

25.09.2007, 08:03

mein Test sollte eigentlich alle punkte an den seiten eines Rectecks durchgehen und testen ob sie sich mit einem Punkt an den Seiten des anderen rechtecks treffen, aber irgendetwas klappt da nicht.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

5

25.09.2007, 08:41

Um mit dem Guten anzufangen:
Abgesehen von den Fehlern ist Dein Codingstil nicht soooo schlecht. Ich bin großer OO Fan und finde man sollte es immer anwenden - einzige Ausnahme sind sehr kleine Codestücke, und da gehört das ja dazu.


Ich schätze statt

Quellcode

1
for(int y1 = Rect1[1]; y1 >= Rect1[3]; y1++)


wolltest Du

Quellcode

1
for(int y1 = Rect1[1]; y1 < Rect1[3]; y1++)


Aber das wirklich schlimme ist nicht die Umsetzung von Deinem Algorithmus, sondern der Algorithmus selber. Schau Dir mal den Code von Black-Panther an.

PS: Wenn Du wirklich nur die Seiten nach Deiner Methode abtesten würdest (was ich aber in Deinem Code nicht sehe), so würde es schief gehen, wenn ein Rechteck komplett im anderen drin ist.
"Games are algorithmic entertainment."

6

25.09.2007, 09:30

nein, da sich ja trotzdem (jedenfalls bei zwei gleichgroßen Rechtecken) die seiten treffen, da sie ja genau übereinanderliegen

aber wenn sie unterschiedlich groß sind hast du natürlich recht

Werbeanzeige