2

Я разрабатываю игру на Java, которая использует легкую библиотеку игр Java (LWJGL) с OpenGL.Вызов методов класса, создавшего этот экземпляр

У меня возникла следующая проблема.

Я хочу создать 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 и другие материалы довольно общие и не должны влиять на проблему. Я могу предоставить их, если это необходимо.

ответ

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 не реализует Это. Я предполагаю, что это артефакт кода, очищенный для публикации. Просто используйте тип, подходящий для вашей ситуации.

+0

Это сработало! Спасибо! Для тех, кто хочет использовать этот метод, помните, что вы должны инициализировать 'ArrayList' (я тоже забыл, что при создании этого потока),' Game' является «интерфейсом», я просто забыл изменить эти две строки, пока я был очистка кода, извините. – KrisRogo