我正在开发一个使用轻量级Java游戏库(LWJGL)和OpenGL的Java游戏。
我遇到了以下问题。
我想在主循环中的对象中创建所有纹理的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
}
}
Player.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()
方法中实例化的少数事物之一。
此外,在过去,我通过让每个实体加载自己的纹理文件来解决这个问题。但随着我增加复杂性和地图大小,将相同的图像加载数百次变得非常低效。
我从this回答了上面代码的状态。
我相信我必须将ResourceLoader.class
和Player.class
放在game.class
内,考虑到大约有20个文件需要这种处理并且大部分都是它们长达200多行。
我认为我的Texture
对象以及OpenGL和其他东西的初始化非常通用,不应该影响相关问题。如有必要,我可以提供这些。
答案 0 :(得分: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
没有实现它。我认为这是为发布清理的代码工件。只需使用适合您情况的类型。