Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 13.01.2004, 21:29 Titel: Kollisionsabfrage |
|
|
Hallo
Bei mir funktioniert das mit der Kollision nicht ganz.
Kann mir jemand bitte den Fehler sagen ich habe schon alles probiert es
muss in dieser Funktion der Fehler liegen.
Die Kollisionsabfrage soll so funktionieren:
ich berrechne die 2 Mittelbunkte der RECT und wenn der Abstand der
2 Mittelpunkte kleiner breite/2(des 1RECTS) und breite/2(des 2RECTS) ist
findet eine Kollision statt.
Mein Code dazu ist folgender:(irgendwo muss ein Fehler sein)
BOOL KOLLISION::BoundingBox(RECT rect1,RECT rect2)
{
//BoundingBox 1
int breite1;
int hoehe1;
int mittex1;
int mittey1;
breite1 = rect1.right - rect1.left;
hoehe1 = rect1.bottom - rect1.top;
mittex1 = rect1.left + breite1 /2;
mittey1 = rect1.top + hoehe1 / 2;
//BoundingBox 2
int breite2;
int hoehe2;
int mittex2;
int mittey2;
breite2 = rect2.right - rect2.left;
hoehe2 = rect2.bottom - rect2.top;
mittex2 = rect2.left + breite2 /2;
mittey2 = rect2.top + hoehe2 / 2;
int mittelpunktxabstand = mittex1 - mittex2;
int mittelpunktyabstand = mittey1 - mittey2;
//KollisionsAbfrage
//Vorzeichen wenn nötig posetiv machen
if(mittelpunktxabstand < 0)
{
mittelpunktxabstand = mittelpunktxabstand * -1;
}
if(mittelpunktyabstand < 0)
{
mittelpunktyabstand = mittelpunktyabstand * -1;
}
//Kollisionsabfrage
if(mittelpunktxabstand < breite2/2 + breite1/2 && mittelpunktyabstand < hoehe2/2 + hoehe1/2)
{
return TRUE;
}
return FALSE;
};
Danke im Voraus.
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.01.2004, 21:38 Titel: |
|
|
Wieso berechnest du den Mittelpunkt und nutzt dann ne Elipsenkollision das ist aber nicht ganz das was eine Rechteckskollisionskollision auszeichnet. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
kapuzineralex Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 8 Wohnort: München Medaillen: Keine
|
Verfasst am: 14.01.2004, 09:21 Titel: |
|
|
Hi Florian,
ich weiß aus dem Kopf nicht, wie es mit den Prioritäten der einzelnen Operatoren zueinandern genau ausschaut, aber probier mal bitte anstatt
if(mittelpunktxabstand < breite2/2 + breite1/2 && mittelpunktyabstand < hoehe2/2 + hoehe1/2)
folgendes:
if( (mittelpunktxabstand < (breite2/2 + breite1/2)) && (mittelpunktyabstand < (hoehe2/2 + hoehe1/2)) )
Für (breite2/2) kannst Du auch schreiben (breite2 >> 1), das ist schneller.
Grüße,
Alex |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 14.01.2004, 09:28 Titel: |
|
|
Meine Methode ist schneller:
Code: |
bool Collide(int x1, int y1, int w1, int h1,
int x2, int y2, int w2, int h2)
{
if( (x1 > x2 + w2 - 1) || (x2 > x1 + w1 - 1) ||
(y1 > y2 + h2 - 1) || (y2 > y1 + h1 - 1) )
return false;
else
return true;
}
|
w = Breite
h = Höhe
[Nachtrag]
Oder benutz die Funktion IntersectRect, aber die ist auch langsamer als meine. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
|