# Problem bei Kollisionsabfrage



## Triton171 (14. Sep 2015)

Hey Leute,
ich bin grade dabei, ein kleines Spiel zu programmieren, habe jetzt aber ein Problem bei der Kollisionsabfrage des Spielers mit seiner Umgebung. Der Spieler glitcht nämlich manchmal in die Blöcke des Bodens, sodass noch genau der oberste Pixel des Spielers nicht im Boden ist. Sonst funktioniert die Kollisionserkennung fehlerfrei. Hier der Code der Kollisionsabfrage:

```
//Returns true if the player has intersects with any block
    public synchronized boolean hasIntersectsWithBlock(){
        //The player's hitBox
        Rectangle hitBox = this.hitBox;
        //The block the player's position (top left corner) is in
        Point playerBlock = manager.getBlockPositionInGame( (int) getPosX(), (int) getPosY());
        //HitBox for any block (size is always the same, position can be changed for every block
        Rectangle blockHitBox = new Rectangle();
        //Adjust the size of the block hitBox
        blockHitBox.setSize(BlockInfo.SIZE, BlockInfo.SIZE);
        //Loop through all the blocks which have to be checked for intersects
        for(int i = (int) playerBlock.getX(); i < (int) playerBlock.getX()+Player.numberOfIntersectBlockChecksX; i++){
            for(int k = (int) playerBlock.getY(); k < (int) playerBlock.getY()+Player.numberOfIntersectBlockChecksY; k++){
                //Check if the block is not air (ID 0=air)
                if(manager.level.blockIDs[i][k]!=0){
                    //Adjust the location of the block hitbox
                    blockHitBox.setLocation(i*BlockInfo.SIZE, k*BlockInfo.SIZE);
                    //Check for intersects
                    if(hitBox.intersects(blockHitBox)) return true;
                }
                }
            }
       
        return false;
    }
```

Und hier noch eine Methode, die ich aufrufe:

```
//Returns the coordinates of the block in which the given virtual point in the game is in
    public Point getBlockPositionInGame(int posX, int posY){
        int blockPosX = (int) posX/BlockInfo.SIZE;
        int blockPosY = (int) posY/BlockInfo.SIZE;
       
        return new Point(blockPosX, blockPosY);
    }
```

LG Triton171


----------



## System.exit(0) (15. Sep 2015)

Wieso machst du nicht aus dem Spieler ein Rectangle, so dass du einfach intersects(Spieler-Rectangle, blockhitBlock) machst.

Du fragst für den Spieler, glaube ich, nur einen Punkt ab. Und das ist zu wenig.

System.exit(0)


----------



## Triton171 (15. Sep 2015)

Hey,
ich habe die Methode intersects(Rectangle r) der Klasse Rectangle aufgerufen.
Das gibt doch zurück, ob die beiden Rechtecke irgendwelche Schnittstellen miteinander haben,
oder verwechsle ich da was?
LG Triton171


----------



## Major_Sauce (16. Sep 2015)

Intersects gibt genau das zurück, was der Name schon sagt, und zwar ob sie überlappen.
Also ja, im Grunde gibt es zurück ob es einen gemeinsammen Punkt gibt.

lg Major


----------



## Triton171 (19. Sep 2015)

Ich hab es jetzt gelöst, auch wenn ich nicht weiß, wo der Fehler war.
Ich hab einfach die Methode neu geschrieben und jetzt funktionierts...
LG Triton171


----------

