调用实例化了这个类的类的方法



我正在用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.classPlayer.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没有实现它。我认为这是为发布而清理的代码工件。只需使用适合您情况的类型即可。

相关内容

  • 没有找到相关文章

最新更新