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: