Olá pessoal.
Estou construindo um game com Java do estilo “brick-brack”. No jogo há alguns objetos, como o player, a bola e o brick, que é o bloco a ser quebrado. Cada objeto do jogo possui um hitbox, um Rectangle do pacote do java.awt.Rectangle
.
Para detectar a intersecção da bola com um bloco específico eu construí o método detectBrickIntersection()
que utiliza o método intersects()
e verifica se os hitboxes se intersectaram, gerando uma ação na bola dependendo de que lado ela colidiu com o bloco.
O problema é que, aparentemente, esse método não tem 100% de precisão: às vezes ele “demora” 2 pixels para perceber que um retângulo cruzou com outro, às vezes 4. Isso gera uma ação incorreta na bola do jogo. Não sei se há algum erro lógico na maneira em que implementei o método mas, desde já agradeço a ajuda.
deixo o método como exemplo:
public void detectBrickIntersection() {
A: for (int i = 0; i < map.getMapArr().length; i++) {
for (int j = 0; j < map.getMapArr()[0].length; j++) {
if(this.map.getMapArr()[i][j] > Map.INACTIVE_BRICK) {
Rectangle hitBoxCurrentBrick = this.map.getBrickHitBox(j, i);
if(this.ball.getBallHitBox().intersects(hitBoxCurrentBrick)) {
this.map.setMapArr(Map.INACTIVE_BRICK, i, j);
this.map.setTotalBricks(this.map.getTotalBricks() - 1);
this.score += this.POINT_VALUE;
//Adicionar parâmetro de correção da intersecção;
if(this.ball.getBallXPos() + (Ball.BALL_SIZE - 2) <= hitBoxCurrentBrick.x || this.ball.getBallXPos() + 2 >= hitBoxCurrentBrick.x + hitBoxCurrentBrick.width) {
this.ball.setBallXDir(-this.ball.getBallXDir());
System.out.println("lados, bola: "+this.ball.getBallXPos() + "brick x: "+hitBoxCurrentBrick.x+" largura: "+hitBoxCurrentBrick.width);
}else {
this.ball.setBallYDir(-this.ball.getBallYDir());
System.out.println("cima ou baixo, bola: "+this.ball.getBallXPos() + "brick x: "+hitBoxCurrentBrick.x+" largura: "+hitBoxCurrentBrick.width);
}
break A;
}
}
}
}
}