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