java - 光滑2d |渲染和更新的最佳方式

标签 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);
    }
}

最佳答案

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。

关于java - 光滑2d |渲染和更新的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15993012/

相关文章:

.net - 如何在多个解决方案之间共享相同的 Resharper 设置,而无需手动干预?

css - 你能解决我奇怪的 Sharepoint CSS 缓存/自定义问题吗?

java - android: 无法播放视频

reactjs - React Redux Store 更新,但组件未重新渲染

java - 如何在 JFrame 中渲染一个面板

java - 具有不同颜色树线的 JTree?

c# - 以编程方式从插件获取当前的 Visual Studio IDE 解决方案目录

java - 数据库打开和关闭建议

java - 如何在没有应用程序上下文的情况下使用 spring-security 过滤器?

java - 尝试将我的数据存储在数组内的文本文件中