Dúvida no método intersects() Java

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;
					}
				}	
			}
		}
	}

Você não inverteu as coordenadas i e j?

Independente de ter ou não ter trocado i por j, o problema do OP é conhecido como “tunneling”. As vezes não houve troca e foi proposital, pois j usualmente no for representa colunas (relativo à x no plano 2D) e i representa linhas (y).

O problema relatado acontece quando de um frame para outro do jogo o objeto em questão “passa por dentro” do outro objeto, gerando decisões incorretas. Há algumas formas de mitigar isso. Uma delas é controlar melhor como seu modelo está sendo atualizado em cada frame, normalmente multiplicando a velocidade, por exemplo, pelo tempo que passou entre um frame e o próximo. Outra é criar sondas de colisão, ou seja, pequenos retângulos que vão atuar como os verificadores da intersecção. Na sua bola por exemplo vc poderia ter vários retângulos em cima da fronteira do círculo. Uma outra forma é prever, no frame anterior, o que vai acontecer no próximo e dependendo disso prevenir o tunelamento.