I am getting a null pointer excecption to both my sprite and level. I am working on my mob class, and when I try to move him and the move function is called, the game crashes after checking collision with a null pointer excecption. Taking out the one line that actually checks if the tile located in front of it fixes the problem.
Also, if i keep collision ON but don't move the position of the mob (the spider) the game works fine. I will have collision, and the spider appears on the screen, only problem is, getting it to move causes this nasty error that i just can't fix.
true
Exception in thread "Display" java.lang.NullPointerException
at com.apcompsci.game.entity.mob.Mob.collision(Mob.java:67)
at com.apcompsci.game.entity.mob.Mob.move(Mob.java:38)
at com.apcompsci.game.entity.mob.spider.update(spider.java:58)
at com.apcompsci.game.level.Level.update(Level.java:55)
at com.apcompsci.game.Game.update(Game.java:128)
at com.apcompsci.game.Game.run(Game.java:106)
at java.lang.Thread.run(Unknown Source)
Here is my renderMob mehtod:
public void renderMob(int xp,int yp,Sprite sprite,int flip)
{
xp -= xOffset;
yp-=yOffset;
for(int y = 0; y<32; y++)
{
int ya = y + yp;
int ys = y;
if(flip == 2||flip == 3)ys = 31-y;
for(int x = 0; x<32; x++)
{
int xa = x + xp;
int xs = x;
if(flip == 1||flip == 3)xs = 31-x;
if(xa < -32 || xa >=width || ya<0||ya>=height) break;
if(xa<0) xa =0;
int col = sprite.pixels[xs+ys*32];
if(col!= 0x000000)
pixels[xa+ya*width] = col;
}
}
}
My spider class which determines the sprite and where I control movement, also rendering the spider onto the screen, when I increment ya to move the sprite, I get the crash, but without ya++, it runs flawlessly with a spider sprite on screen:
package com.apcompsci.game.entity.mob;
import com.apcompsci.game.entity.mob.Mob.Direction;
import com.apcompsci.game.graphics.Screen;
import com.apcompsci.game.graphics.Sprite;
import com.apcompsci.game.level.Level;
public class spider extends Mob{
Direction dir;
private Sprite sprite;
private boolean walking;
public spider(int x, int y)
{
this.x = x <<4;
this.y = y <<4;
sprite = sprite.spider_forward;
}
public void update()
{
int xa = 0, ya = 0;
ya++;
if(ya<0)
{
sprite = sprite.spider_forward;
dir = Direction.UP;
}
if(ya>0)
{
sprite = sprite.spider_back;
dir = Direction.DOWN;
}
if(xa<0)
{
sprite = sprite.spider_side;
dir = Direction.LEFT;
}
if(xa>0)
{
sprite = sprite.spider_side;
dir = Direction.LEFT;
}
if(xa!= 0 || ya!= 0)
{
System.out.println("true");
move(xa,ya);
walking = true;
}
else{
walking = false;
}
}
public void render(Screen screen)
{
screen.renderMob(x, y, sprite, 0);
}
}
This is th mob class that contains the move() method that is called in the spider class above. This move method calls the collision method. tile and sprite comes up null in the debugger:
package com.apcompsci.game.entity.mob;
import java.util.ArrayList;
import java.util.List;
import com.apcompsci.game.entity.Entity;
import com.apcompsci.game.entity.projectile.DemiGodProjectile;
import com.apcompsci.game.entity.projectile.Projectile;
import com.apcompsci.game.graphics.Sprite;
public class Mob extends Entity{
protected Sprite sprite;
protected boolean moving = false;
protected enum Direction
{
UP,DOWN,LEFT,RIGHT
}
protected Direction dir;
public void move(int xa,int ya)
{
if(xa != 0 && ya != 0)
{
move(xa,0);
move(0,ya);
return;
}
if(xa>0) dir = Direction.RIGHT;
if(xa<0) dir = Direction.LEFT;
if(ya>0)dir = Direction.DOWN;
if(ya<0)dir = Direction.UP;
if(!collision(xa,ya)){
x+= xa;
y+=ya;
}
}
public void update()
{
}
public void shoot(int x, int y, double dir)
{
//dir = Math.toDegrees(dir);
Projectile p = new DemiGodProjectile(x, y,dir);
level.addProjectile(p);
}
public boolean collision(int xa,int ya)
{
boolean solid = false;
for(int c = 0; c<4; c++)
{
int xt = ((x+xa) + c % 2 * 14 - 8 )/16;
int yt = ((y+ya) + c / 2 * 12 +3 )/16;
if(level.getTile(xt, yt).solid()) solid = true;
}
return solid;
}
public void render()
{
}
}
Finally, here is the method in which i call the add() method for the spider to add it to the level:
protected void loadLevel(String path) {
try{
BufferedImage image = ImageIO.read(SpawnLevel.class.getResource(path));
int w = width =image.getWidth();
int h = height = image.getHeight();
tiles = new int[w*h];
image.getRGB(0, 0, w,h, tiles,0, w);
}
catch(IOException e){
e.printStackTrace();
System.out.println("Exception! Could not load level file!");
}
add(new spider(20,45));
}
I don't think i need to include the level class but just in case, I have provided a gistHub link for better context. It contains all of the full classes listed above , plus my entity class and maybe another.
Thanks for the help if you decide to do so, much appreciated!
Also, please tell me if i'm in the wrong section of stackeoverflow, i figured that since this is the gamign section that it belonged but debugging code normally goes into the general section.