2

我正在用 Java 开发一个游戏,它使用带有 OpenGL 的轻量级 Java 游戏库 (LWJGL)。

我遇到了以下问题。

我想在主循环中的一个对象中创建一个包含所有纹理的 ArrayList,并从在这个主对象中实例化的对象中访问这些纹理。一个简化的例子:

游戏类:

public class Game {

  ArrayList Textures; // to hold the Texture object I created
  Player player; // create Player object

  public Game() {
    new ResourceLoader(); // Here is the instance of the ResourceLoader class
    player = new Player(StartingPosition) // And an instance of the playey, there are many more arguments I give it, but none of this matter (or so I hope)

    while(true) { // main loop
      // input handlers

      player.draw() // here I call the player charcter to be drawn

    }
  }

  // this method SHOULD allow the resource loader to add new textures
  public void addTextures (Texture tx) {
    Textures.add(tx);
  }
}

资源加载器类

public class ResourceLoader {
  public ResourceLoader() {
    Interface.this.addTexture(new Texture("image.png")); // this is the line I need help with
  }
}

播放器类

public class Player {
  public player() {
    // some stuff, including assignment of appropriate textureID
  }

  public void draw() {
    Interface.this.Textures.get(this.textureID).bind(); // this also doesn't work
    // OpenGL method to draw the character
  }
}

在我的真实代码中,ResourceLoader该类有大约 20 个要加载的纹理。

游戏中共有 400 多个实体具有类似的绘制方法,Player.class并且大多数具有相同的纹理;例如,大约有 150-180 个墙壁对象都显示相同的砖块图像。

Game对象不是主类,也没有static void main()方法,但它是游戏方法中为数不多的实例化的东西之一main()

另外,在过去,我通过让每个实体加载自己的纹理文件来解决这个问题。但是随着我增加复杂性和地图大小,加载相同的图像数百次变得非常低效。

我从这个答案到达了上面代码的状态。

我相信我必须把ResourceLoader.classandPlayer.class放在里面game.class,考虑到大约有 20 个文件需要这种处理,而且其中大多数文件的长度超过 200 行,这不是一个好的解决方案。

我认为我的Texture对象以及 OpenGL 和其他东西的初始化非常通用,不应该影响相关问题。如有必要,我可以提供这些。

4

1 回答 1

1

使“外部”类实例成为构造函数的参数:

public class Player {
   final Interface obj;

   public player(Interface obj) {
       this.obj = obj;
      // some stuff, including assignment of appropriate textureID
   }

   public void draw() {
       obj.Textures.get(this.textureID).bind();
   }
}

public class ResourceLoader {
   public ResourceLoader(Interface obj) {
      obj.addTexture(new Texture("image.png"));
   }
}

并实例化那些Game

new Player(this);

注意:示例行使用Interface但未Game实现它。我认为这是为发布而清理的代码工件。只需使用适合您情况的类型即可。

于 2013-08-17T22:37:34.730 回答