我正在用 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.class
andPlayer.class
放在里面game.class
,考虑到大约有 20 个文件需要这种处理,而且其中大多数文件的长度超过 200 行,这不是一个好的解决方案。
我认为我的Texture
对象以及 OpenGL 和其他东西的初始化非常通用,不应该影响相关问题。如有必要,我可以提供这些。