Detecção de colisão

Pessoal, estou fazendo um joguinho simples do bomberman.
O motivo é simplesmente para testar colisão, mas estou tendo problemas nesse assunto.
A função de colisão está apenas retornando false, que no caso, o personagem não faz movimento nenhum.

Segue a classe com a função de colisão que eu criei:

[code]public final class PanelLinhas extends javax.swing.JPanel {

Point2D posicao, posicaoPersonagem;
//matriz que representa o campo de jogo
int campo[][] = new int[10][10];
int bx = 0, by = 0;
int qtd = 10;
String path = "C:/Users/Luiz/Documents/NetBeansProjects/Linhas/";
public boolean cima = false, baixo = false, esquerda = false, direita = false, espaco = false;

public boolean colisao(double xp, double yp) {
    int i, j;
    int xinicial, xfinal, yinicial, yfinal;
    for (i = 0; i < qtd; i++) {
        for (j = 0; j < qtd; j++) {
            if (campo[i][j] == 1) {
                xinicial = i * 80; //800x600 dividido por 10, equivale ao tamanho de cada quadrado da matriz
                yinicial = j * 60;
                xfinal = xinicial + 80;
                yfinal = yinicial + 60;
                if ((xinicial < xp + 5 && xfinal > xp + 5) || (xinicial < xp - 5  && xfinal > xp - 5)) {
                    if ((yinicial < yp + 5 && yfinal > yp + 5) || (yinicial < yp - 5 && yfinal > yp - 5)) {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

public void preencheMatriz() {
    int i, j;
    for (i = 0; i < qtd; i++) {
        for (j = 0; j < qtd; j++) {
            if (i == 0 || i == 9 || j == 0 || j == 9) {
                campo[i][j] = 1;
            } else {
                campo[i][j] = 0;
            }
        }
    }
    campo[5][5] = 1;
}

public PanelLinhas() {
    initComponents();
    preencheMatriz();
    posicao = new Point2D.Double(0, 0);
    this.setSize(super.getSize());
    posicaoPersonagem = new Point2D.Double(95, 60);
}

@Override
public void paintComponent(Graphics g) {
    BufferedImage bi = (BufferedImage) createImage(super.getWidth(), super.getHeight()); //bufferedImage usa double buffering
    Graphics2D desenho = bi.createGraphics();
    double x = posicaoPersonagem.getX();
    double y = posicaoPersonagem.getY();
    Toolkit tk = this.getToolkit();

    int i, j;
    double largura = super.getWidth() / qtd;
    double altura = super.getHeight() / qtd;

    for (i = 0; i < qtd; i++) {
        for (j = 0; j < qtd; j++) {
            //desenho.drawRect((int) (i * largura), (int)(j*altura), (int) largura, (int)altura);
            if (campo[i][j] == 0) {
                desenho.drawImage(tk.getImage(path+"grama.jpg"), (int) (i * largura), (int) (j * altura), (int) largura, (int) altura, this);
            } else {
                desenho.drawImage(tk.getImage(path+"tijolo.jpg"), (int) (i * largura), (int) (j * altura), (int) largura, (int) altura, this);
            }
        }
    }
    if (espaco) {
        bx = (int) posicaoPersonagem.getX();
        by = (int) posicaoPersonagem.getY();
    }
    if (cima) {
        if(colisao(x,y)){
            System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
        y -= 5;
        }System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
    }
    if (baixo) {
        if(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY())){
            System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
        y += 5;
        }System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
    }
    if (esquerda) {
        if(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY())){
            System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
        x -= 5;
        }System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
    }
    if (direita) {
        if(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY())){
            System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
        x += 5;
        }System.out.println(colisao(posicaoPersonagem.getX(),posicaoPersonagem.getY()));
    }

    if (bx != 0 && by != 0) {
        desenho.drawImage(tk.getImage(path+"Bomb.png"), bx, by, this);
    }
    posicaoPersonagem.setLocation(x, y);
    desenho.drawImage(tk.getImage(path+"bomberman.gif"),
            (int) posicaoPersonagem.getX(), (int) posicaoPersonagem.getY(), this);
    g.drawImage(bi, 0, 0, this);

}[/code]

na outra classe, eu defini o tamanho da tela:

public FrameLinhas() { int bordaHoriz, bordaVert; bordaHoriz = 16; bordaVert = 38; initComponents(); panelLinhas = new PanelLinhas(); //criei um JPanel this.setSize(800 + bordaHoriz, 600 + bordaVert); panelLinhas.setSize(this.getWidth() - bordaHoriz, this.getHeight() - bordaVert); //configurei o tamanho this.add(panelLinhas); //adicionei o JPanel ao JFrame }

Alguém pode me ajudar?
Grato

se precisarem do projeto inteiro, é só falar.

poxa, ninguém?

Não entendo nada de programação para jogos, mas já andei dando uma olhada nos tutoriais do PontoV. Dá uma olhada lá.
Link: http://www.pontov.com.br/site/

Pra faculdade eu fiz um jogo de futebol em C++, implementei a colisão por bounding boxes (como eram duas figuras retangulares).
Se você estiver usando outras figuras talvez haja outros métodos de colisão mais adequado. Talvez Pixel Perfect.

Que tipo de imagens estarão se colidindo?

Bounding Boxes:

[code]int DetectorColisoes::detectarColisao(ElementoRetangular *elementoA, ElementoRetangular *elementoB)
{
int colisao;
int sobreposicao;

if( elementoA -> getX() > (elementoB -> getX() + elementoB -> getLargura()) || 
		elementoA -> getY() > (elementoB -> getY() + elementoB -> getAltura()) ||
		(elementoA -> getX() + elementoA -> getLargura()) < elementoB -> getX() ||	
 		(elementoA -> getY() + elementoA -> getAltura()) < elementoB -> getY() )
{
	colisao = NENHUMA_COLISAO;
}
else
{
 	colisao = COLISAO_ESQUERDA;
  	sobreposicao = abs(elementoA -> getX() - (elementoB -> getX() + elementoB -> getLargura()));

	int sobreposicaoTestada = abs((elementoA -> getX() + elementoA -> getLargura()) - elementoB -> getX());
	if(sobreposicaoTestada < sobreposicao)
    	{
	  	colisao = COLISAO_DIREITA;
	  	sobreposicao = sobreposicaoTestada;
    	}

	sobreposicaoTestada = abs(elementoA -> getY() - (elementoB -> getY() + elementoB -> getAltura()));
	if( sobreposicaoTestada < sobreposicao)
	{
		colisao = COLISAO_CIMA;
		sobreposicao = sobreposicaoTestada;
	}

	sobreposicaoTestada = abs((elementoA -> getY() + elementoA -> getAltura()) - elementoB -> getY());		
	if( sobreposicaoTestada < sobreposicao )
	{
		colisao = COLISAO_BAIXO;
		sobreposicao = sobreposicaoTestada;
	}

	elementoA -> tratarColisao(colisao);
	elementoB -> tratarColisao(inversoDaColisao(colisao));
}
	
return colisao;

}[/code]

obrigado pelas dicas, vou tentar aqui e posto resultados.

a colisão tem que ser feita do personagem (bomberman.gif) com as paredes (tijolo.jpg), que no caso eu defini numa matriz com o valor de 1 para cada posição onde eu quiser desenhar tijolos na tela.