javarenderslick2d

Slick2d | Best way to render & update


The problem:

What do you think what is the best way to render and update entities?
Currently im using a world class to do this.

Links:

The game (finished)

The code (from World.java):

List<Entity> entities = new ArrayList<Entity>();

public void render(GameContainer gc, Graphics g, Camera camera) {
    // Draw background
    background.draw(0 - camera.getX(), 0 - camera.getY(), 2100, 2100);

    // Loop through all entities and render
    for (int i = 0; i < entities.size(); i++) {
        Entity entity = entities.get(i);

        // A very long if... render only if visible
        if (entity.getX() < player.getX() + ((gc.getWidth() / 2) + entity.getWidth() + 50) &&
            entity.getX() > player.getX() - ((gc.getWidth() / 2) + entity.getWidth() + 50) &&
            entity.getY() < player.getY() + ((gc.getHeight() / 2) + entity.getHeight() + 50) &&
            entity.getY() > player.getY() - ((gc.getHeight() / 2) + entity.getHeight() + 50)) {
                entity.render(gc, g);
            }
        }
    }


    public void update(GameContainer gc, int delta) {
        // Loop through entities and update all time
        for (int i = 0; i < entities.size(); i++) {
            Entity entity = entities.get(i);
            entity.update(gc, delta);
    }
}

Solution

  • List<Entity> entities = new ArrayList<Entity>();
    
    public void render(GameContainer gc, Graphics g, Camera camera) {
       background.draw(0 - camera.getX(), 0 - camera.getY(), 2100, 2100);
       for( Entity entity : entities ) {
          if( entity.isVisible( player, gc )) {
             entity.render( gc, g );
          }
       }
    }
    
    public void update(GameContainer gc, int delta) {
       for( Entity entity : entities ) {
          entity.update( gc, delta );
       }
    }
    

    Entity.update() should not modify the list, in place use:

    private final List< Entity > toBeRemoved = new LinkedList<>();
    
    public void update(GameContainer gc, int delta) {
       toBeRemoved.clear();
       for( Entity entity : entities ) {
          if( entity.update( gc, delta )) {
             toBeRemoved.add( entity );
          }
       }
       entities.removeAll( toBeRemoved );
    }
    

    Entity.update() return true when the entity need removal.