我正在用Java开发一款游戏,该游戏使用带有OpenGL的轻量级Java游戏库(LWJGL)。
我遇到了以下问题。
我想在主循环中创建一个对象中所有纹理的ArrayList,并从这个主对象中实例化的对象访问这些纹理。一个简化的例子:
game.class:
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);
}
}
ResourceLoader.class
public class ResourceLoader {
public ResourceLoader() {
Interface.this.addTexture(new Texture("image.png")); // this is the line I need help with
}
}
播放器.class
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
和Player.class
放在game.class
中,这不是一个好的解决方案,因为大约有20个文件需要这种处理,其中大多数都是200多行长。
我认为我的Texture
对象以及OpenGL和其他东西的初始化都是非常通用的,不应该影响问题。如果需要,我可以提供这些。
将"外部"类实例作为构造函数的参数:
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
没有实现它。我认为这是为发布而清理的代码工件。只需使用适合您情况的类型即可。