F
frozen-man
Gast
Hallo
Ich schreibe gerade einen Arkanoid Klon und bin aufgrund von problemen mit der Kollisionsüberprüfung schon ziemlich frustriert.
Ich poste einfach mal meinen Code, vieleicht hat ja irgendjemand eine Ahnung wieso das nicht richtig funktioniert.
Die Logik die dahinter steckt ist folgende:
Ich berechne von jedem stein die Kollisionszeiten mit oben, unten, links und rechts (Seiten vom Stein).
Dann prüfe ich ob das t >0 und <1 ist (1 bedeutet einen ganzen Bewegungsschritt und 0 keine Bewegung),
berechne die neue Position und überprüfe ob der Ball an einer der Kanten auftrifft und starte die kollisionsbehandlung
Vielen Dank schon mal im Vorraus
Gruß
Tobi
Ich schreibe gerade einen Arkanoid Klon und bin aufgrund von problemen mit der Kollisionsüberprüfung schon ziemlich frustriert.
Ich poste einfach mal meinen Code, vieleicht hat ja irgendjemand eine Ahnung wieso das nicht richtig funktioniert.
Die Logik die dahinter steckt ist folgende:
Ich berechne von jedem stein die Kollisionszeiten mit oben, unten, links und rechts (Seiten vom Stein).
Dann prüfe ich ob das t >0 und <1 ist (1 bedeutet einen ganzen Bewegungsschritt und 0 keine Bewegung),
berechne die neue Position und überprüfe ob der Ball an einer der Kanten auftrifft und starte die kollisionsbehandlung
Vielen Dank schon mal im Vorraus
Gruß
Tobi
Code:
public void pruefeKollisionStein(){
double t=kleinstesT();
this.ballxPos = neuePos(ballxPos, richtungx, t);
this.ballyPos = neuePos(ballyPos, richtungy, t);
ball.setxPos(ballxPos);
ball.setyPos(ballyPos);
kollisionStein();
}
public double kleinstesT(){
double t, speicher =1;
this.ballxPos = ballxPos - richtungx;
this.ballyPos = ballyPos - richtungy;
for(int i=0; stein[i]!=null; i++){
if(stein[i].vorhanden == true){
int oben = stein[i].getOben();
int unten = stein[i].getUnten();
int links = stein[i].getLinks();
int rechts = stein[i].getRechts();
// für Kollision mit "Unten"
t = tBerechnen(ballyPos, richtungy, unten);
if((t>0)&& (t < 1)){
if(imBereich(neuePos(ballxPos, richtungx, t),links, rechts)){
if(t<speicher){
speicher = t;
}
}
}
// für Kollision mit "Oben"
t=tBerechnen((ballyPos+ballRadius), richtungy, oben);
if((t>0) && (t<1)){
if(imBereich(neuePos(ballxPos, richtungx, t),links, rechts)){
if(t<speicher){
speicher = t;
}
}
}
if(richtungx!= 0){
// für Kollision mit "Links"
t=tBerechnen((ballxPos+ballRadius), richtungx, links);
if((t>0) && (t<1)){
if(imBereich(neuePos(ballyPos, richtungy, t), oben, unten)){
if(t<speicher){
speicher=t;
}
}
}
// für Kollision mit "Rechts"
t=tBerechnen(ballxPos, richtungx, rechts);
if((t>0) && (t<1)){
if(imBereich(neuePos(ballyPos, richtungy, t), oben, unten)){
if(t<speicher){
speicher=t;
}
}
}
}
}
}
return speicher;
}
private int neuePos(int aktPos, int richtung, double t) {
return (int)(aktPos + (t*richtung));
}
private double tBerechnen(int aktPos, int richtung, int konst) {
double wert = 0.0;
wert+= ((konst-aktPos)/(double)richtung);
return wert;
}
private boolean imBereich(int x, int kleinerWert, int großerWert){
if(((x+ballRadius) >= kleinerWert) && (x <= großerWert)){
return true;
}
else
return false;
}