Slick2d |渲染的最佳方式&更新

时间:2013-04-13 21:12:59

标签: java render solution slick2d

问题:

您认为渲染和更新实体的最佳方式是什么?
目前我正在使用世界级来做这件事。

链接:

  

The game (finished)

代码(来自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);
    }
}

1 个答案:

答案 0 :(得分:2)

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()不应该使用以下方式修改列表:

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()在实体需要删除时返回true。