Duvida sobre colisao!

pessoal na classe que segue abaixo tem um metodo private void verSeBateuNaBarra() com uma equaçao mas eu nao entendi porque ela funciona!! alguem poderia me explicar como ela funciona? Porque ela foi implementada daquele jeito e porque velocidadeY = -velocidadeY e porque tb nao muda a velocidadeX???

ahh essa classe corresponde a uma das classes do jogo sobre arkanoid!!

[code]
import java.awt.Dimension;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import edugraf.jadix.fachada.PaginaDix;
import edugraf.jadix.fachada.Pichador;

public class Bola
{
Pichador pix = new Pichador();
PaginaDix página;
Dimension tamanhoDoAplique;
Integer velocidadeX = 8;
Integer velocidadeY = 10;
Barra barra;
List listaDeBricks;

public Bola(Barra barraDoJogo, PaginaDix páginaDix, List<Brick> bricksRecebidos)
    {
	pix.fixarÍcone("recursos/bola.gif").tornarVisível().semRastros();
	Timer tempo = new Timer();
	tempo.schedule(new andar(), 0, 50);
	página = páginaDix;
	barra = barraDoJogo;
	listaDeBricks = bricksRecebidos;
	velocidadeX = 8+(int)(Math.random()*2);
	

}

private class andar extends TimerTask 

{

	@Override
	public void run() {
		pix.andarPara(pix.obterPosição().x + velocidadeX, pix
				.obterPosição().y
				+ velocidadeY);
		verSeBateuNasParedes();
		verSeBateuNaBarra();
		verSeBateuNosBlocos();

	}

	private void verSeBateuNosBlocos() {
		for (Brick brick : listaDeBricks) {
			if (pix.obterPosição().x < brick.obterX()
					+ brick.obterLargura() / 2
					&& pix.obterPosição().x > brick.obterX()
							- brick.obterLargura() / 2
					&& pix.obterPosição().y > brick.obterY()
							- brick.obterLargura() / 2
					&& pix.obterPosição().y < brick.obterY()
							+ brick.obterLargura() / 2) {
				velocidadeY = -velocidadeY;
				brick.quebrar();
				
			}
		}
		Brick.removerBricks();

	}

	private void verSeBateuNaBarra() 
            {
		if (pix.obterPosição().x < barra.obterX() + barra.obterLargura() / 2
		&&  pix.obterPosição().x > barra.obterX()- barra.obterLargura() / 2 
		&&  pix.obterPosição().y < -180 + barra.obterAltura() /2 
		&&  pix.obterPosição().y > -180 - barra.obterAltura() /2) 
                    {
			velocidadeY = -velocidadeY;
		}
	}

}

private void verSeBateuNasParedes() {
	if (pix.obterPosição().y > 280) {
		velocidadeY = -velocidadeY;
	}
	if (pix.obterPosição().x > 280 || pix.obterPosição().x < -280) {
		velocidadeX = -velocidadeX;
	}
	if (pix.obterPosição().y < -280) {
		pix.andarPara(0, 0).fixarÍcone("recursos/game_over.gif")
				.fixarProfundidade(1);
		velocidadeX = 0;
		velocidadeY = 0;
	}
}

}[/code]

E se a classe fosse assim implementada (ainda sendo implementada)e o metodo que verifica se bateu nos tijolos fosse assim implementado???

public class GerenciadorDeColisoes extends TimerTask
{

	Rectangle retanguloBola = new Rectangle();
	Rectangle retanguloBarra = new Rectangle();
	Rectangle retanguloParede = new Rectangle();
	Rectangle retanguloTijolo = new Rectangle();
	
	List<Tijolo> listaDeTijolos = Tijolo.listaDeTijolos;
	
	public GerenciadorDeColisoes()
	{
		retanguloBola.height = 15;
		retanguloBola.width= 15;
		
		retanguloBarra.height = 15;
		retanguloBarra.width= 25;
			
		retanguloParede.height = 15;
		retanguloParede.width= 25;
	}

	@Override
	public void run()
	{		
		verificaSeBateuNosTijolos();
		verificaSeBateuNaBarra();
		
	}
		
	public void verificaSeBateuNosTijolos()
	{
		int i = 0;
		for (Tijolo tijolo : listaDeTijolos)
		{ 
			if (retanguloBola.intersects(listaDeTijolos.get(i)))
			{
				tijolo.destrua(listaDeTijolos.get(i));
			}
			i++;
		}
				
		
	}
	
	public void verificaSeBateuNaBarra()
	{
		if (retanguloBola.intersects(retanguloBarra))
                {
                      // implementar!!
                }
        }
    *
    *
    *
}

vlwww

jhoon

No arkanoid, pelo menos os mais clássicos, quando a bola bate na barra, sua velocidade horizontal não é alterada, apenas sua velocidade vertica. Assim, faz todo o sentido apenas inverter a velocidade vertical, no caso, velocidadeY. Mas isso tb depende da lógica do jogo que vc quer implementar. Eu já vi arkanoid que vc podia mudar a a velocidade x da bolinha tb.
A lógica era:
Se a bola bater exatamente no meio da barra, a velocidade x não é alterada. Se ela bater na metade esquerda da barra, a velocidade de x passa a ser direcionada para a esquerda (velocidadeX negativa), com magnitude proporcional a distancia do impacto par ao meio da barra. Caso bata na metade direita, acontece a mesmas coisa, com a diferenca que a velocidade x seria positiva. Enfim, tudo depende de como vc vai querer implementar o jogo.
Eu particularmente gostava mais de jogar a versão que se pode controlar a bola dependendo da posição que vc bate na barra. Ele exigia mais “perícia” do jogador…hehe