movimentação e colisão com j2me

Estou tentando fazer um jogo bem simples em j2me, mas como sou iniciante estou com vários problemas. O maior problema q estou passando agora e quando a movimentação do personagem na tela.
O jogo é o sokoban, ou box world para alguns, para quem não sabe é o jogo onde tem q ficar empurrando caixas.

as paredes do cenário eu fiz usando tiled e o personagem é um sprite, fiz a função para o personagem andar pela sala e até ae tudo bem, mas quando fui colocar a colisão com as paredes ae deu zica.

Fiz 4 funções de colisão dentro da classe do personagem e na classe GameScreen, que estende a GameCanvas, coloquei um conjunto de else if que pegam o botão que foi pressionado e chama e chama a função de colisão especifica para ver se houve ou não colisão. O problema é que quando o personagem colide com a parede seja em qualquer direção ele tá parando de se mover em todas as outras tb. Alguem sabe como posso resolver isso?

Segue esse pedaço do meu código.

//Classe do Personagem

public class PlayerSprite extends Sprite{

public boolean ColisaoCima(boolean key,TiledLayer other){
if(key && collidesWith(other, true))
return true;
else
return false;
}

public boolean ColisaoBaixo(boolean key,TiledLayer other){
    if(key && collidesWith(other, true))
        return true;
    else
        return false;
}

public boolean ColisaoDireita(boolean key,TiledLayer other){
    if(key == true && collidesWith(other, false))
        return true;
    else
        return false;
}

public boolean ColisaoEsquerda(boolean key,TiledLayer other){
    if(key && collidesWith(other, false))
        return true;
    else
        return false;
}

}

//Clase Game Screen

public class GameScreen extends GameCanvas implements Runnable, CommandListener{

    int keyStates = getKeyStates();
    
    //Player na posição original
    player.setFrame(0);
    
    // Player Moves
    boolean esquerda = (keyStates & LEFT_PRESSED) != 0;
    boolean direita = (keyStates & RIGHT_PRESSED) !=0;
    boolean cima = (keyStates & UP_PRESSED) != 0;
    boolean baixo = (keyStates & DOWN_PRESSED) != 0;
          
    if ( (keyStates & LEFT_PRESSED) != 0 && !player.ColisaoEsquerda(esquerda,terrain)){
        player.moveLeft();
    }else if ((keyStates & RIGHT_PRESSED) !=0 && !player.ColisaoDireita(direita,terrain)){            
        player.moveRight();
    } else if ((keyStates & UP_PRESSED) != 0 && !player.ColisaoCima(cima,terrain)){
        player.moveUp();
    } else if((keyStates & DOWN_PRESSED) != 0 && !player.ColisaoBaixo(baixo,terrain)){
        player.moveDown();
    }

Valeu ae pessoal.

Abraço

Depois que o sprite colide você precisa fazer ele voltar. Se não, toda vez que você checar, ele vai acusar a colisão e não vai sair do lugar. Mude a lógica para ficar assim:

  1. Checa se alguma tecla foi pressionada
  2. Foi pressionada? Move o sprite
  3. Checa se houve colisão
  4. Houve colisão? Retorna o sprite à posição original

Kra, para tentar resolver esse problema de quando colidir, ele não ficar identificando a colisão eu criei as 4 funções exatamente por esse motivo. E como eu fiz tudo aquilo que esta escrito como GameScreen, dentro de uma função que é chamada dentro da função run(), ele teria de pegar todos os valores de novo a cada iteração.
Eu já tinha feito algo parecido com o que vc disse para tentar resolver mas tinha dados alguns problemas pq as vezes ele entrava dentro da parede.
Mesmo assim resolvi modificar a lógica e testar exatamente do jeito que vc falou e para minha surpressa funcionou direitinho. Agora tá funcionando do jeito que eu queria.
Valeu mesmo hein, vc não sabe o quanto me ajudou e o peso que tirou das minhas costas.