Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
23.02.2003, 13:16
Zero0Cool



Also ich versuche eine Breakout-Variante zu programmieren, aber bei der Kollisionserkennung habe ich immer noch Probleme.
Ich habe den Threat von Andreas schon gelesen, aber der hilft mir auch nicht weiter.
Hier ist jetzt mal mein Quellcode:

void Block::Collision(Sprite* Ball, PointManager* PM, DirectXAudio* DXAudio, Sprite* Funken)
{
double y;
double x;
double m;
double t;
double timel;
double timer;
double timeo;
double timeu;
bool links = false;
bool rechts = false;
bool oben = false;
bool unten = false;

for(int i=0; i<BlocksAnzahl; i++)
{
if(daweg[i])
{
//Formel: y=mx+t

if(Ball->StepX==0)
{
return;
}
m = Ball->StepY / Ball->StepX; //Steigung
t = Ball->RY() - m*Ball->RX(); //y-Abschnitt

//links
x = (float)Blocks[i].RX();
y = m*x+t;
timel = (x-Ball->RX()+Ball_Durchmesser)/Ball->StepX;
if((y>=Blocks[i].RY()) && (y<=Blocks[i].RY()+Block_Height) && (timel>=0) && (timel<=1))
links = true;

//rechts
x = (float)Blocks[i].RX()+Block_Width;
y = m*x+t;
timer = (x-Ball->RX())/Ball->StepX;
if((y>=Blocks[i].RY()) && (y<=Blocks[i].RY()+Block_Height) && (timer>=0) && (timer<=1))
rechts = true;

//oben
y = (float)Blocks[i].RY();
x = (y-t)/m;
timeo = (y-Ball->RY()+Ball_Durchmesser)/Ball->StepY;
if((x>=Blocks[i].RX()) && (x<=Blocks[i].RX()+Block_Width) && (timeo>=0) && (timeo<=1))
oben = true;

//unten
y = (float)Blocks[i].RY()+Block_Height;
x = (y-t)/m;
timeu = (y-Ball->RY())/Ball->StepY;
if((x>=Blocks[i].RX()) && (x<=Blocks[i].RX()+Block_Width) && (timeu>=0) && (timeu<=1))
unten = true;

//die kürzeste Zeit:
if(links && (unten || oben))
{
if((timel < timeu) && (timel < timeo))
{
//links getroffen
Ball->StepX = -Ball->StepX;
links = false;
rechts = false;
unten = false;
oben = false;
daweg[i] = false;
return;
}
else{
//unten oder oben getroffen
Ball->StepY = -Ball->StepY;
links = false;
rechts = false;
unten = false;
oben = false;
daweg[i] = false;
return;
}
}

if(rechts && (unten || oben))
{
if((timer < timeu) && (timer < timeo))
{
//rechts getroffen
Ball->StepX = -Ball->StepX;
links = false;
rechts = false;
unten = false;
oben = false;
daweg[i] = false;
return;
}
else{
//unten oder oben getroffen
Ball->StepY = -Ball->StepY;
links = false;
rechts = false;
unten = false;
oben = false;
daweg[i] = false;
return;
}
}

if(links || rechts)
{
//links getroffen
Ball->StepX = -Ball->StepX;
links = false;
rechts = false;
unten = false;
oben = false;
daweg[i] = false;
return;
}

if(oben || unten)
{
//oben oder unten getroffen
Ball->StepY = -Ball->StepY;
links = false;
rechts = false;
unten = false;
oben = false;
daweg[i] = false;
return;
}
}
}
}
Na ja und ich weiß nicht mehr weiter, warum das nicht funktioniert.

Zur Erklärung:
- BlocksAnzahl ist die Anzahl an Blocks die vorhanden sind.
- das Array bool daweg[] speichert, ob ein Block noch vorhanden ist.
- Ball->StepX ist die X-Bewegung des Balles in einen Frame
- Ball->StepY ist analog nur für Y
- die Funktion RX() und RX() geben die Koordinaten des Sprites zurück.
- die restlichen Variablen erklären sich selbst, denke ich.

Vielen Dank schon mal.

--

Ein Programm fertigprogrammieren:
Ist der Höhepunkt der Gefühle

zum Seitenanfang zum Seitenende Profil || Suche
001
24.02.2003, 18:11
apfelkorn



bitte benutzt das code-thwb-tag, so ist der quelltext nicht zu verstehen und unleserlich :(

--


Dieser Beitrag wurde am 24.02.2003 um 18:11 von apfelkorn bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
12.03.2003, 14:53
WareWolf



ich weiss ja nicht, warum alle mit der kollisionserkennung von 2D Sprites ihre Doktorarbeit machen wollen. Ich hab mir jetzt den Quellcode nicht angeschaut und versteh auch zuwenig von C um die den Fehler zu zeigen aber eine Spritekollision auf einer Enene ist doch Pippifax, denn:

Du hast sicher die Ursprungskoordinaten(z.B. obersterlinkerPixel) jedes Sprites X_pos,Y_pos, ebenso die Breite und die Höhe der Sprites.
Nun prüf doch zunächst einfach, ob beide X_pos der betreffenden Sprites so nahe beeinander sind unter Berücksichtung der Breite, ob sie sich berrühren, wenn nicht brauchst gar nicht weitermachen -> keine Kollision
wenn ja, prüf auch noch die Y_Pos nach dem selben Verfahren, wenn ja -> Kollision.
Fertig.

Du gehst also nur nach dem äusseren Umriss, ich würde sogar noch ein paar Pixel kleiner prüfen. Das genügt vollkommen, wenn du natürlich anfängst die transparenten Pixel der Sprites nicht einzubeziehen...dann mach die Doktorarbeit ruhig, braucht aber kein Mensch.

/e shit, hab gerade erst aufs Datum geguckt, ist ja schon ne alte Schwarte /e

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW


Dieser Beitrag wurde am 12.03.2003 um 14:55 von WareWolf bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche