[LibGDX & Artemis] Random Null Pointer Exception in System

I’ve been learning how to use the LibGDX game API, and I’ve enjoyed using it so far… but I found this blog and it introduced me to Artemis and the Entity-System framework, which I also have begun to enjoy using.

Whilst trying to reconstruct Artemis’s “Spaceship Warrior” demo, I’ve come across a problem. I can render stuff onto the screen, and I’m reading successfully from the atlas and everything is working just fine… to a certain point.

As it is, you can move the ship around no problem. When you start shooting though, it gives you about 3/5 seconds before it drops this error and stack.


Exception in thread "LWJGL Application" java.lang.NullPointerException
	at game.madsplash.spacewar.Systems.SpriteRenderSystem.process(SpriteRenderSystem.java:91)
	at game.madsplash.spacewar.Systems.SpriteRenderSystem.processEntities(SpriteRenderSystem.java:68)
	at com.artemis.EntitySystem.process(EntitySystem.java:57)
	at game.madsplash.spacewar.GameScreen.render(GameScreen.java:53)
	at com.badlogic.gdx.Game.render(Game.java:46)
	at game.madsplash.spacewar.SpaceWarrior.render(SpaceWarrior.java:21)
	at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
	at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

It’s telling me that an error is occurring in my sprite rendering system, around the part I determine it’s position.


public class SpriteRenderSystem extends EntitySystem {
	@Mapper ComponentMapper<Position> PosMap;
	@Mapper ComponentMapper<Sprite> SpriteMap;
	
	private OrthographicCamera camera;
	private SpriteBatch batch;
	
	private TextureAtlas atlas;
	private HashMap<String, AtlasRegion> regions;
	private Bag<AtlasRegion> regionsByEntity;
	
	private List<Entity> sortedEntities;
	
	
	
	@SuppressWarnings("unchecked")
	public SpriteRenderSystem(OrthographicCamera camera) {
		super(Aspect.getAspectForAll(Position.class, Sprite.class));
		
		this.camera = camera;
	}
	
	@Override
	protected void initialize() {
		batch = new SpriteBatch();
		
		atlas   = new TextureAtlas(Gdx.files.internal("Images/Atlases/pack.atlas"));
		regions = new HashMap<String, AtlasRegion>();
		
		for(AtlasRegion r: atlas.getRegions()) {
			regions.put(r.name, r);
			
			System.out.println("[NOTICE] " + r.name + " was added to the region list.");
		}
		
		regionsByEntity = new Bag<AtlasRegion>();
		
		sortedEntities = new ArrayList<Entity>();
	}

	@Override
	protected void processEntities(ImmutableBag<Entity> entities) {
		for(int i = 0; entities.size() > i; i++) {
			process(sortedEntities.get(i));
		}
	}

	@Override
	protected boolean checkProcessing() {
		return true;
	}
	
	@Override 
	protected void begin() {
		batch.setProjectionMatrix(camera.combined);
		batch.begin();
	}
	
	protected void process(Entity e) {
		if(PosMap.has(e)) {
			Position position = PosMap.getSafe(e);
			Sprite sprite     = SpriteMap.get(e);
			
			AtlasRegion spriteRegion = regionsByEntity.get(e.getId());
			
			batch.setColor(sprite.r, sprite.g, sprite.b, sprite.a);
			>>> float posX = position.x - (spriteRegion.getRegionWidth() / 2 * sprite.scaleX);
			float posY = position.y - (spriteRegion.getRegionHeight() / 2 * sprite.scaleY);
			
			batch.draw(spriteRegion, posX, posY, 0, 0, spriteRegion.getRegionWidth(), spriteRegion.getRegionHeight(), sprite.scaleX, sprite.scaleY, sprite.rotation);
		}
	}
	
	@Override
	protected void end() {
		batch.end();
	}
	
	@Override
	protected void inserted(Entity e) {
		Sprite sprite = SpriteMap.get(e);
		
		regionsByEntity.set(e.getId(), regions.get(sprite.name));
		
		sortedEntities.add(e);
		
		Collections.sort(sortedEntities, new Comparator<Entity>() {

			@Override
			public int compare(Entity e1, Entity e2) {
				Sprite s1 = SpriteMap.get(e1);
				Sprite s2 = SpriteMap.get(e2);
				
				return s1.layer.compareTo(s2.layer);
			}
			
		});
	}
	
	@Override
	protected void removed(Entity e) {
		regionsByEntity.set(e.getId(), null);
	}

}

The error then changes, when I remove spriteRegion.getRegionWidth() and cousin.


Exception in thread "LWJGL Application" java.lang.NullPointerException
	at com.badlogic.gdx.graphics.g2d.SpriteBatch.draw(SpriteBatch.java:632)
	at game.madsplash.spacewar.Systems.SpriteRenderSystem.process(SpriteRenderSystem.java:94)
	at game.madsplash.spacewar.Systems.SpriteRenderSystem.processEntities(SpriteRenderSystem.java:68)
	at com.artemis.EntitySystem.process(EntitySystem.java:57)
	at game.madsplash.spacewar.GameScreen.render(GameScreen.java:53)
	at com.badlogic.gdx.Game.render(Game.java:46)
	at game.madsplash.spacewar.SpaceWarrior.render(SpaceWarrior.java:21)
	at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
	at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

I need help. :emo: