Kollision von 2 Objekten

tyno1584

Mitglied
Ich wollte fragen, wie ich es machen soll, denn die Funktion der Kollision stimmt, aber die x und y Koordinate stimmt nicht überein.
Hier wäre der Code:

Kreis kreis;
Rechteck rechteck;
Bricks bricks;
int x,y,r; //Kreis Position nd grösse
int x2,y2,l2,b2; // Rechteck grösse und Position
int vx,vy; // Kreis Geschwindigkeit
int vx2,vy2;// Rechteck Geschwindigkeit
color c,c2; //Farben Kreis&Rechteck
int x3,y3;
int l3,b3;

int a;
void setup(){
x=100; y=350; r=25;
x2=200; y2=600; l2=150; b2=20;
vx=2; vy=2; vx2=2; vy2=2;
c=200; c2=100;
x3= 40 ; y3= 40;
l3=50; b3=20;
kreis = new Kreis(x,y,r,x2,y2,vx,vy,l2,b2,c,c2);
rechteck = new Rechteck(x,y,r,x2,y2,l2,b2,vx,vy,vx2,vy2,c2);
bricks = new Bricks(l3,b3);
background(c);
size(650,650);



}
void draw(){

bricks.zeichnen();
kreis.zeichnen();
kreis.kolrand();
rechteck.keyPressed();
rechteck.zeichnen();
kreis.kolobj();
rechteck.kolrand();


}
class Kreis{
Rechteck rechteck;
int x,y,r;
int vx,vy;
color c;
color c2;
int x2,y2,l2,b2;




Kreis(int x0, int y0, int r0, int x20, int y20, int vx0, int vy0, int l20, int b20, int c0, int c20){ // defintion varaibelne
x=x0; y=y0; r=r0;x2= x20; y2=y20;vx=vx0; vy=vy0; l2=l20 ;b2=b20;c=c0; c2=c20;
}

void zeichnen(){
fill(c2);circle(x,y,r);

fill(c);circle(x,y,r);
x=x-vx; y=y+vy;
fill(c2);circle(x,y,r);



}
//Kreis kollidiert mit Rändern
void kolrand(){
if( (x+r/2>=width) || (x-r/2<=0) ){ vx=-vx;}
if( (y-r/2<=0) ){ vy=-vy;}
}
void kolobj(){
//Kollision an den Objekten
if (y>=y2 && y<=y2+b2) { //Kreis ist über oder unter Rand
if(abs(x2-x-l2) <=r/2 || abs(x-x2) <=r/2){ vx=-vx;}
}
if (x>=x2 && x<=x2+l2) { //Kreis ist über oder unter Rand
if(abs(y-y2-b2) <=r/2 || abs(y-y2) <=r/2){ vy=-vy;
}
}
}

}
class Rechteck{
int x,y,r;
int vx,vy;

int x2,y2,l2,b2;
int vx2,vy2;
color c;

Rechteck(int x0, int y0, int r0,int x20, int y20, int l20,int b20, int vx0, int vy0, int vx20, int vy20, int c0){
x=x0; y=y0; r=r0;x2=x20; y2=y20; l2=l20; b2=b20; vx=vx0; vy=vy0;vx2= vx20; vy2=vy20; c=c0;
}
void zeichnen(){
fill(c);
rect(x2,y2,l2,b2);
}

void kolrand(){
if(x2<=0){
x2=x2+vx2;
}
if(x2+l2>=width){
x2=x2-vx2;
}
}

void keyPressed(){
if (keyCode == RIGHT) {x2=x2+vx2;}

if( keyCode == LEFT) {x2=x2-vx2;}
}
}

danke
 
Code bitte in Code-Tags posten. Dazu einfach den Knopf </> links oberhalb des Eingabebereichs nutzen!
Und dann wirklich den ganzen Code posten. Das erste wird ja auch in irgend einer Klasse sein. So frei im Raum sind ja keine Variablen und Methoden zu erstellen.

Und wir hatten ja in einem anderen Thread schon erste Hinweise gegeben (sorry - hatte keine Zeit, da in Ruhe zu antworten!)

Das erste, was Du machen musst, ist eine Bereinigung. Variablen gehören nur da hin, wo sie auch wirklich sinn machen. Dazu sollten diese auch so erkenntlich sein, dass klar ist, was diese bedeuten.

Was hat denn z.B. ein Kreis alles an Werten, die da übergeben werden?
int x0, int y0, int r0, int x20, int y20, int vx0, int vy0, int l20, int b20, int c0, int c20)
Das ist einfach unverständlich und dann ist es auch nicht so einfach möglich, da etwas sinnvolles vorzuschlagen.

Einen Mittelpunkt und einen Radius kann ich verstehen. Also x0/y0 und r0 -> wozu das 0? x,y,r wären da ausreichen.
Dann evtl. eine Geschwindigkeit in v in x und y Richtung. dann haben wir vx und vx.
Aber sonst? Was brauchst Du sonst noch? Das kannst Du evtl. etwas erläutern.

Ähnlich beim Rechteck!

Wie kann dann eine Prüfung der Kollision aussehen? Da kann man z.B. im Kreis eine Methode haben wie:
Java:
void kolobj(Rechteck obj){
    //Kollision an den Objekten
    if (y>=obj.y2 && y<=obj.y2+obj.b2) { //Kreis ist über oder unter Rand
        if(abs(obj.x2-x-obj.l2) <=r/2 || abs(x-obj.x2) <=r/2) {
            vx=-vx;
        }
    }
    if (x>=obj.x2 && x<=obj.x2+obj.l2) { //Kreis ist über oder unter Rand
        if(abs(y-obj.y2-obj.b2) <=r/2 || abs(y-obj.y2) <=r/2) {
            vy=-vy;
        }
    }
}

Ich habe da erst einmal das Objekt, mit dem die Kollision geprüft werden soll, angegeben. Aber da ich die ganzen Variablen nicht kenne: Keine Ahnung, was denn die Eigenschaften vom obj sind. Vermutlich x2, y2, l2 und b2
Das ist aber geraten - weil ich bei dem Code keine Lust habe. da tiefer rein zu schauen.

Dabei ist es egal, ob das Objekt dort übergeben wird, oder ob es dem Kreis übergeben wird. Du kannst die Objekte ja alle erzeugen und dann gegenseitig zuweisen. Dann hast Du etwas wie dies im Kreis. Und bei der Erstellung wird dann halt mittels eines AUfrufs von setObject das Rechteck zugewiesen.:
Java:
private Rechteck obj;

public void setObject(Rechteck obj) {
    this.obj = obj;
}

void kolobj(){
    //Kollision an den Objekten
    if (y>=obj.y2 && y<=obj.y2+obj.b2) { //Kreis ist über oder unter Rand
        if(abs(obj.x2-x-obj.l2) <=r/2 || abs(x-obj.x2) <=r/2) {
            vx=-vx;
        }
    }

    if (x>=obj.x2 && x<=obj.x2+obj.l2) { //Kreis ist über oder unter Rand
        if(abs(y-obj.y2-obj.b2) <=r/2 || abs(y-obj.y2) <=r/2) {
            vy=-vy;
        }
    }
}


An der Stelle ggf. noch ein kleiner Hinweis zu dem vermultichen Verständnisproblem:
Java:
x=100; y=350; r=25;
x2=200; y2=600; l2=150; b2=20;
vx=2; vy=2; vx2=2; vy2=2;
c=200; c2=100;
x3= 40 ; y3= 40;
l3=50; b3=20;
kreis = new Kreis(x,y,r,x2,y2,vx,vy,l2,b2,c,c2);
rechteck = new Rechteck(x,y,r,x2,y2,l2,b2,vx,vy,vx2,vy2,c2);

Es gibt in einer Klasse, dessen Namen wir nicht kennen einen Haufen Variablen. x, y, r, .....
Diesen weist Du werte zu. Dann kommt die Zeile mit dem new Kreis. Hier wird ein neuer Kreis erzeugt mit den Werten aus diesen Variablen!
Ebenso beim Rechteck.

Stell Dir vor, Variablen sind Zettel. Da hast Du dann einen Ordner mit vielen Zetteln für x, y, r, ... Und da schreibst DU dann Zahlen drauf.

Dann wird ein Kreis erstellt, d.h. ein neuer Aktenordner mit neuen Zetteln wird erstellt. Und da werden die Werte von den Zetteln des anderen Ordners übergeben und eingetragen.

Das dann auch noch für Rechteck....

Du hast also drei Ordner mit Zetteln. Auf einem Zettel in jedem Ordner steht oben gross: X
Jetzt nimmst Du einen Bleistift und radierst den vorhandenen Wert weg und schreibst einen neuen Wert hin.
==> Dadurch ändert sich absolut nichts an den Zetteln in den anderen Ordnern.


Oder anders vorgestellt. Objekte sind jetzt Menschen. Wir haben Karteikarten. Und du hast jetzt Karteikarten mit x, y, r und da steht jeweils ein Wert.
Jetzt sagst Du zu Deinem Vater: Du bist jetzt ein Kreis. Du hast folgende Karten: x = .. , y = ..., r= ....
Dein Vater notiert dies auf seinen Karteikarten.

Dann geht ihr getrennte Wege und du änderst die Werte auf deinen Karteikarten: Da verändert sich nichts auf den Karten deines Vaters!

Daher sind die Werte, die dann ja nie mehr verändert werden, immer schön auf dem Startwert.
 
Oke, danke vielmals, ich habe eben auch noch eine dritte Klasse aber die hat nichts mit diesen Objekten zu tun, deswegen habe ich sie nicht auch noch dazu geschickt und die ganzen variablen waren Versuche, dass ich es hinbekomme, dass die Kollision funktioniert.
 

Neue Themen


Zurück
Oben