Detecção de colisão e Vector

Olá pessoal,

Então, mais uma vez venho aqui para tentar solucionar os problemas do jogo estilo sokoban, ou box world para alguns, que estou fazendo, que para quem não sabe é aquele jogo onde vc tem que ficar empurrando as caixas.
Eu criei um mapa utilizando tiled e para colocar as caixas foi feito um vetor de sprites.
Não sei se dava para fazer mais facilmente, mas eu fui criando um novo sprite utilizando um for q vai de zero até a quantidade de caixas que quero no campo e depois setava a posição adicionava na layermanager e depois no vetor. Não entendo muito bem como funciona o Vector para J2me, estou lendo vários tutoriais e tentando fazer.
O problema é que, para teste, eu coloquei a colisão com a caixa somente quando pressionada a seta para esquerda. Porém quando clico na seta para a esquerda eu tenho a seguinte mensagem de erro. “Uncaught exception java/lang/NullPointerException”.

Se alguem puder me ajudar a corrigir tal problema e me explicar pq isso esta acontecendo tb eu agradeceria muitissimo.
Segue parte do código, caso alguem tenha alguma dica para melhorá-lo estou aceitando.

//classe GameScreen

public class GameScreen extends GameCanvas implements Runnable, CommandListener{

//Sprites da caixa
private Vector vctBox;
ObstaculoSprite newCaixa;

//Setup dos sprites das caixas
vctBox = new Vector();
Image imageBox = Image.createImage("/caixa.png");
int xc=120;
int yc=140;

//Layer Manager
layerManager = new LayerManager();
layerManager.append(player);

    for (int i = 0; i < 5; ++i){
        ObstaculoSprite newCaixa = new ObstaculoSprite(imageBox,30,30);
        newCaixa.setPosition(xc,yc);
        layerManager.append(newCaixa);
        marcas.addElement(newCaixa);
        if(i==1){
            xc-=30;
            yc+=30;
        }else if(i==2){
            xc+=30;
            yc+=30;
        }else if(i==3){
            xc+=30;
        }
    }

layerManager.append(terrain);
layerManager.append(fundo);

// funcão que é chamada na função run()
public void tick() {
// Player Actions
int keyStates = getKeyStates();

    //Player na posição original
    player.setFrame(0);
    
    // Player Moves
    if ( (keyStates & LEFT_PRESSED) != 0){
        player.moveLeft();
        if(player.Colisao(newCaixa)){
            newCaixa.moveLeft();
        }
        if(player.Colisao(terrain)){
            player.moveRight();
            player.setFrame(0);
        }            
    }else if ((keyStates & RIGHT_PRESSED) !=0){
        player.moveRight();
        if(player.Colisao(terrain)){
            player.moveLeft();
            player.setFrame(0);
        }
    } else if ((keyStates & UP_PRESSED) != 0){
        player.moveUp();
        if(player.Colisao(terrain)){
            player.moveDown();
            player.setFrame(0);
        }
    } else if((keyStates & DOWN_PRESSED) != 0){
        player.moveDown();
        if(player.Colisao(terrain)){
            player.moveUp();
            player.setFrame(0);
        }
    }
}

//Classe PlayerSprite
public class PlayerSprite extends Sprite{

public boolean Colisao(Sprite other){
if(collidesWith(other, true))
return true;
else
return false;
}

//classe ObstaculoSprite

public class EnemySprite extends Sprite {

public void moveLeft(){
    getXY();
    if (x - MOVE > 0)
        move(MOVE * -1,0);
}

public void moveRight() {
    getXY();
    if (x + MOVE + frameWidth < scnWidth)
        move(MOVE,0);
}

public void moveUp() {
    getXY();
    if (y - MOVE > 0)
        move(0,MOVE * -1);
}

public void moveDown() {
    getXY();
    if (y + MOVE + frameHeight < scnHeight)
        move(0,MOVE);
}

}

Esse erro ocorre sempre que alguma coisa é nula.

Pode ser esse vetor “marcas”, por exemplo.

Verifique na linha do erro o que pode ser nulo e certifique-se de ter dado “new” em todos os objetos.

Ah sim, quando postar códigos, por favor, use a tag code. Fica mais fácil para nós, que vamos te ajudar.
Se não sabe fazer isso, dá uma lida aqui: http://www.guj.com.br/posts/list/50115.java

Vou dar uma olhada mais detalhada nisso sim e eu realmente não sabia como colocar os códigos. Nas próximas mensagens tentarei melhorar esse quesito.
Valeu brigadão.

percebi que o marca do trecho de código que cria os sprites da caixa e posiciona na tela estava errado, graças a minha mania de copiar e colar códigos parecidos, ae esqueci de modificar essa linha.

for (int i = 0; i &lt; 5; ++i){ EnemySprite newCaixa = new EnemySprite(imageBox,30,30); newCaixa.setPosition(xc,yc); layerManager.append(newCaixa); [b]vctBox[/b].addElement(newCaixa); if(i==1){ xc-=30; yc+=30; }else if(i==2){ xc+=30; yc+=30; }else if(i==3){ xc+=30; } }

Criei uma nova função de colisão dentro da classe PlayerSprite que recebe um Vector

public boolean Colisao(Vector other){ int i=0; boolean retorno = false; do{ Sprite Caixa = (Sprite)other.elementAt(i); if(collidesWith(Caixa, true)) retorno = true; i++; }while(i&lt;other.size()|| retorno!=true); return retorno; }

e a função, da GameScreen, que faz verificação de que tecla foi pressionada e faz o personagem se mover detectando a colisão ficou assim:

// Player Moves
        if ( (keyStates & LEFT_PRESSED) != 0){
            player.moveLeft();
            if(player.Colisao(vctBox)){
                newCaixa.moveLeft();
            }
            if(player.Colisao(terrain)){
                player.moveRight();
                player.setFrame(0);
            }            
        }else if ((keyStates & RIGHT_PRESSED) !=0){
            player.moveRight();
            if(player.Colisao(terrain)){
                player.moveLeft();
                player.setFrame(0);
            }
        } else if ((keyStates & UP_PRESSED) != 0){
            player.moveUp();
            if(player.Colisao(terrain)){
                player.moveDown();
                player.setFrame(0);
            }
        } else if((keyStates & DOWN_PRESSED) != 0){
            player.moveDown();
            if(player.Colisao(terrain)){
                player.moveUp();
                player.setFrame(0);
            }
        }

Lembrando que eu só testo a colisão somente quando o personagem se move para a esquerda. Mas agora esta aparecendo a seguinte mensagem de erro:

"Uncaught exception java/lang/ArrayIndexOutOfBoundsException: 5 &gt;= 5."

Se alguem ter alguma idéia do motivo por favor me ajudem.

[quote=kyzw]percebi que o marca do trecho de código que cria os sprites da caixa e posiciona na tela estava errado, graças a minha mania de copiar e colar códigos parecidos, ae esqueci de modificar essa linha.

[code]for (int i = 0; i < 5; ++i){
EnemySprite newCaixa = new EnemySprite(imageBox,30,30);
newCaixa.setPosition(xc,yc);
layerManager.append(newCaixa);

        vctBox.addElement(newCaixa);

        if(i==1){
            xc-=30;
            yc+=30;
        }else if(i==2){
            xc+=30;
            yc+=30;
        }else if(i==3){
            xc+=30;
        }
    }

[/code]

Criei uma nova função de colisão dentro da classe PlayerSprite que recebe um Vector

public boolean Colisao(Vector other){ int i=0; boolean retorno = false; do{ Sprite Caixa = (Sprite)other.elementAt(i); if(collidesWith(Caixa, true)) retorno = true; i++; }while(i&lt;other.size()|| retorno!=true); return retorno; }

e a função, da GameScreen, que faz verificação de que tecla foi pressionada e faz o personagem se mover detectando a colisão ficou assim:

// Player Moves
        if ( (keyStates & LEFT_PRESSED) != 0){
            player.moveLeft();
            if(player.Colisao(vctBox)){
                newCaixa.moveLeft();
            }
            if(player.Colisao(terrain)){
                player.moveRight();
                player.setFrame(0);
            }            
        }else if ((keyStates & RIGHT_PRESSED) !=0){
            player.moveRight();
            if(player.Colisao(terrain)){
                player.moveLeft();
                player.setFrame(0);
            }
        } else if ((keyStates & UP_PRESSED) != 0){
            player.moveUp();
            if(player.Colisao(terrain)){
                player.moveDown();
                player.setFrame(0);
            }
        } else if((keyStates & DOWN_PRESSED) != 0){
            player.moveDown();
            if(player.Colisao(terrain)){
                player.moveUp();
                player.setFrame(0);
            }
        }

Lembrando que eu só testo a colisão somente quando o personagem se move para a esquerda. Mas agora esta aparecendo a seguinte mensagem de erro:

"Uncaught exception java/lang/ArrayIndexOutOfBoundsException: 5 &gt;= 5."

Se alguem ter alguma idéia do motivo por favor me ajudem.[/quote]

Pode dizer em que linha isso ocorre?

Geralmente isso tem a ver com tentar acessar um índica a mais do que você tem no seu Vector.

Cara, esse teu código tá meio desorganizado, pelo visto você mesmo já está se perdendo nele. Pense com carinho em dar uma refatorada para aumentar a clareza dele.