E
hmm, ich hab jetzt oben net gelesen, worums genau geht, aber ich dachte mir, ich könnte nochmal meine breakout-kolli posten, vielleicht hilft sie ja irgendwie weiter, is nämlich recht kurz und überschaubar. hat zwar net steigungswinkel usw, aber is für 45° auf jeden fall sinnvoll, und der winkel ändert sich ja eigentlich auch nicht, wenn man von der bewegung des "paddle" einmal absieht.
////////////////////////////////////////////////////////
//Prüfen auf Kollision
////////////////////////////////////////////////////////
BOOL Object::TestCollision(Object* Object,int distanceX,int distanceY)
{
//Prüfen, ob das Objekt innerhalb eines bestimmten Bereiches liegt, in
// dem Kollisionen auftreten können. Bereich ist das Rechteck
// distanceX*distanceY
if(((abs(CenterX-Object->CenterX))<=distanceX) &&
(abs(CenterY-Object->CenterY)<=distanceY))
{
//Objekt trifft auf eine Ecke: rechts unten
if(((Object->x==x2)&&(Object->y==y2))
&&(Object-StepX<0)
&&(Object->StepY<0))
{
CollisionPosition = CORNER_COLLISION;
return TRUE;
}
//Objekt trifft auf eine Ecke: rechts oben
else if(((Object->x==x2)&&(Object->y2==y))
&& (Object->StepX<0)
&&(Object->StepY>0))
{
CollisionPosition = CORNER_COLLISION;
return TRUE;
}
//Objekt trifft auf eine Ecke: links oben
else if(((Object->x2==x)&&(Object->y2==y))
&& (Object->StepX>0)
&&(Object->StepY>0))
{
CollisionPosition = CORNER_COLLISION;
return TRUE;
}
//Objekt trifft auf eine Ecke: links unten
else if(((Object->x2==x)&&(Object->y==y2))
&& (Object->StepX>0)
&&(Object->StepY<0))
{
CollisionPosition = CORNER_COLLISION;
return TRUE;
}
// Objekt kommt von oben
else if(((Object->CenterY+Object->FrameHeight/2)==
(CenterY-FrameHeight/2))
&& (Object->CenterY<(CenterY-FrameHeight/2))
&& ( ((Object->x2>=x)&&(Object->x2<=x2))
|| ((Object->x<=x2)&&(Object->x>=x))))
{
Object->CollisionPosition=VERTICAL_COLLISION;
Beep(500,30); //Nur zum Test
return TRUE;
}
// Objekt kommt von unten
else if((((Object->CenterY-Object->FrameHeight/2)== (CenterY+FrameHeight/2))
&& (Object->CenterY>(CenterY+FrameHeight/2))
&& (((Object->x2>=x)&&(Object->x2<=x2))
|| ((Object->x<=x2)&&(Object->x>=x)))))
{
Object->CollisionPosition=VERTICAL_COLLISION;
Beep(500,30);
return TRUE;
}
//Wenn Objekt nicht von Oben oder Unten und auch keine Ecke
//trifft, es aber trotzdem
// im Kollisionsbereich liegt, muss es entweder von links oder
//rechts treffen
else
{
Object->CollisionPosition = HORIZONTAL_COLLISION;
Beep(800,30);
return TRUE;
}
}
//wenn es nicht imKollisionsbereich liegt, keine Kollision (logisch)
else
{
return FALSE;
}
return FALSE;
}
Ich reagiere auf die Kollision, indem ich einer int-Variable CollisionPosition
verschieden Werte für vertikale(von oben oder unten), horizontale oder Eck-Kollisionen zuweise. Je nachdem, welchen Wert sie hat, wird in der Funktion für die Bewegung des Balls entweder bei
a) vertikaler Kollision: der "y-Geschwindigkeit"- des Balls ihr Gegenwert zugewiesen
b) horizontaler Kollision: der "x-Geschwindigkeit"- des Balls ihr Gegenwert zugewiesen
c) Eck-Kollisionen: beiden Geschwindigkeiten ihr jeweiliger Gegenwert zugewiesen.
gruß
--------------------