2D Kollisionsblock?

Servo Herko

Aktives Mitglied
Hallo,
ich wollte wissen wie man einen Block und einen anderen Block gegenseitig blockieren kann...
Damit meine ich z.b. mit
Java:
if(player.intersects(stone);
erst abzufragen ob und dann
sowas wie
Java:
if(player.x>stone.x+stone.width) {
player.x = stone.x+stone.width;
}

nur sowas geht nicht, da er mich immer wenn ich kolidiere auf die x-pos setzt...
Hoff versteht ihr was ich meine und könnt mir helfen, ich hab schon vieles probiert, aber mal flackert
es ordentlich hin und er oder wenn der player mal mit mehr speed drauf prallt, er im block drin steckt usw....
 

Rubber

Aktives Mitglied
nur sowas geht nicht, da er mich immer wenn ich kolidiere auf die x-pos setzt...

Auf welche x Position?
So wie ich das sehe sollte genau das gemacht werden, was du beschreibst.
Ist denn der Wert stone.width festgelegt - oder ist der vllt 0 ?

Auch ist die Frage, wie du die Objekte zeichnest.

Denn in der Regel ist die X-Koordinate auf der Linken Seite eines Objektes (so kenne ich es zumindest)
Dann müsstest du abfragen:

Java:
if( (player.x + player.width) > stone.x)
(Ich hoffe, dein ; nach der Zeile ist da nur fälschlicherweise hin geraten?)

Grundsätzlich würde ich übrigens mit get und set Methoden arbeiten.

aber mal flackert es ordentlich hin und er
Du musst dann logischerweise auch die Geschwindigkeit von player zurück setzen. Bzw den Bewegungsvektor.
Sonst versucht er ja immer wieder nach rechts zu gehen.
(zumindest vermute ich jetzt mal so ohne Code, dass es daran liegen könnte)
 

Rubber

Aktives Mitglied
Hi,
es ist also eine Bewegung nach Links.
Das heißt, player.x nimmt immer weiter ab.
Dann müsste es aber
Java:
if(player.x < stone.x + stone.width)
Heißen.

Das Problem mit dem vorbei gehen müsste doch eigentlich durch die
Java:
player.intersects(stone)
Methode gelöst sein.
Gibt es keine Berührung, muss die position nicht verändert werden.

Also
Java:
if(player.intersects(stone)){
    if(player.x < stone.x + stone.width){
        player.x = stone.x + stone.width;
    }
}

Das Problem an der Sache ist nur, dass bisher unklar ist, aus welche Richtung der player kam.
Wenn er jetzt von links kam, würde er trotzdem auf die Rechte seite gesetzt.
Das kann man lösen, indem man noch die Bewegungsrichtung mit einbaut.
nehmen wir an player.bewegung_x stellt die Bewegung auf der x achse da.
Dann ist player.bewegung_x > 0 eine bewegugn nach rechts und player.bewegung_x < 0 eine Bewegung nach links.

Erweitern wir also die Abfrage wiefolgt.
Java:
if(player.intersects(stone)){
    //wenn der Spieler sich nach links bewegt und in dem Quadrat ist
    if((player.bewegung_x < 0) && (player.x < stone.x + stone.width)){
        //setze ihn auf die rechte Seite
        player.x = stone.x + stone.width;
    }else{
        //wenn der Spieler sich nach rechts bewegt und in dem Quadrat ist
        if((player.bewegung_x > 0) && (player.x + player.width > stone.x)){
            //setze ihn auf die linke Seite
            player.x = stone.x - player.x;
        }
    }
}

und das muss man dann halt für die Hoch und runter bewegung ebenso einbauen.

Hoffe ich konnte dir etwas weiterhelfen udn du hast meine Ausführungen verstehen können ^^
(Ist halt schon etwas später *g)

Wenn nicht:
Frag gerne weiter ;)

Gruß,
Rubber
 

Servo Herko

Aktives Mitglied
Eins hätt ich noch gewusst, was und wie bekommt man denn bewegung_x raus?
Und wie funktioniert das mit bewegung_x < 0 ?

Achja und es gibt noch probleme, wie das wenn er von einer anderen seite im block ist und wieder raus will, wird er auch wieder zurück gesetzt
Hier ein bild:
byfhmhlh_png.htm

Directupload.net - byfhmhlh.png

@Bild:
Hat iwi nicht funktioniert ich habe versucht den link als img zu posten, aber habe so oder so ka von sowas
 
Zuletzt bearbeitet:

Rubber

Aktives Mitglied
Hi,

Eins hätt ich noch gewusst, was und wie bekommt man denn bewegung_x raus?

normalerweise müsste bewegung_x dir bekannt sein.
Wie bewegst du denn den player?

Fragst du die Tasten ab und setzt dann gleich die x bzw y koordinate?
Dann würde sich anbieten es etwa so umzusetzen:

Java:
if(KEY_A){
  player.bewegung_x = -1 * player.geschwindigkeit;
}
//das halt für jede Taste
//und dann zum schluss einfach ein
player.move(bewegung_x, bewegung_y);
//und in der Methode rechnest dann halt x += bewegung_x;

Das nur als nach links code.

Wie meinst du das mit
Und wie funktioniert das mit bewegung_x < 0 ?
?

Zu dem Bild:
eigentlich dürfte er da doch garnicht erst rein kommen?
Fragst du denn auch ab, ob er durch einen Schritt nach rechts in den Block eindringt und setzt ihn dann an die Kante zurück?

Gruß,
Rubber


p.s.
Du musst für das Forum die Internetadresse des Bildes nehmen.
Gehe dazu einfach auf die Seite, auf der das Bild dann hochgeladen ist und klicke rechts auf das Bild.
Dann auf Grafikadresse kopieren.
Und das ist dann die adresse fürs forum, die musst du dann hier nur einfügen.
 
Zuletzt bearbeitet:

Oben