# Rechteck Kollision



## F4ckHanoi (28. Jan 2016)

Ich habe ein kleines Problem bei der Kollisionserkennung. Es geht um zwei Bilder die sozusagen einen Box haben. Mir fehlt nur noch eine Sache.

Pseudocode:

wenn(rechte rahmen von figur den linken rahmen von gegner berührt{ 
    //tu was
}

wenn(linkerahmen von figur den rechten rahmen von gegner berührt{ 
    //tu was
}

Die beiden habe ich schon gelöst und es funktioniert auch wunderbar.

Mein Problem liegt gerade bei:

wenn(untere rahmen von figur den oberen rahmen von gegner berührt{
   //tu was
}


Ich bitte um Hilfe!


----------



## InfectedBytes (28. Jan 2016)

Es ist genau das gleiche. Bloß anstatt die x-Koordinate und die breite zu benutzen, benutzt du eben die y-Koordinate und die höhe


----------



## F4ckHanoi (28. Jan 2016)

Ich habs jetzt versucht aber funktioniert nicht so ganz. Also mein Charakter berührt den Gegner nicht, springt aber über Ihn und dann bekomme ich die Ausgabe. Ich möchte aber, dass wenn ein Kollision stattfindet und mein Charakter über den Gegner ist, etwas passiert


----------



## Blender3D (28. Jan 2016)

Ich habe einen Pacman clone geschrieben. Dort löse ich die Kollision so:
*for* (*int* i = 0; i < rectGhost.length; i++) {

*if* (intersectsRect(rectGhost_)) {_


----------



## Blender3D (28. Jan 2016)

Ich habe einen Pacman clone geschrieben. Dort löse ich die Kollision so:

```
for (int i = 0; i < rectGhost.length; i++) {
            if (intersectsRect(rectGhost[i])) {
                // mach was
            }
        }
```


```
public boolean intersectsRect(Rectangle r) {       
        Rectangle rect = getRectangle();
        if (isPointInRect(rect.x, rect.y, r))
            return true;
        if (isPointInRect(rect.x + rect.width, rect.y, r))
            return true;
        if (isPointInRect(rect.x + rect.width, rect.y + rect.height, r))
            return true;
        if (isPointInRect(rect.x, rect.y + rect.height, r))
            return true;
        return false;
    }

    private boolean isPointInRect(int x, int y, Rectangle r) {
        if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height)
            return true;
        return false;
    }
```


----------



## Jardcore (28. Jan 2016)

Würde das einfach mal auf einem Blatt Papier versuchen


----------



## F4ckHanoi (28. Jan 2016)

Also mit intersects habe ich es versucht. Das hatte ich als erstes vor, habe es auch umgesetzt gehabt, funktioniert aber nicht. Wenn mein Charakter die Feinde berührt, dann verliert er leben. Aber wenn ich auf deren Köpfe springe und drauf "lande", dann sterben diese. Das konnte ich nicht mit intersects programmeiren.

und Jardcore zu deiner Aussage: Hier liegen 5-6 Blätter rum die vollgekrizelt sind :d.


Bitte um Hilfe!


----------



## Jardcore (28. Jan 2016)

Versuche das Problem in Teilprobleme aufzuteilen.
Du brauchst scheinbar eine Kollision eines Charakters von allen Seiten plus einer Spezialbehandlung von Oben.

```
private void checkCollision() {
   for(Enemy enemy : enemies) {
       if(enemy.collidesWith(player)) {
          if(enemy.isUnder(player)) {
              enemy.die();
          } else {
              player.hurt();
          }
       }
   }
}

Entity {
   public boolean isUnder(Entity entity) {
      return distanceToGround() < entity.distanceToGround();
   }

   public double distanceToGround() {
      return (y + size - GROUND_Y);
   }
}
```

Den ersten Teil hast du ja soweit fertig ....denke ich, also eine simple Kollision von allen Seiten.
Du könntest jetzt eine Extra Bedingung erstellen die einfach nur y prüft.

EDIT: Player und Enemy erben von Entity


----------



## Blender3D (28. Jan 2016)

Pseudocode:
wenn (Player.intersects( feind.getRectangle() ){

}


----------



## Blender3D (28. Jan 2016)

Pseudocode:
wenn (Player.intersects( feind.getRectangle() ){
      wenn(  (feind.getY()  -  Player.getY () - minimumHeight)  >= 0  )
              // Spieler über Feind + Mindeshöhe
      sonst
              // Spieler neben unter oder vor Feind

}


----------



## F4ckHanoi (2. Feb 2016)

Vielen dank für eure Hilfe 

alles hat wunderbar geklappt.


----------

