Как правильно расширить класс Sprite в LibGDX

В настоящее время я занимаюсь разработкой игр как хобби и сталкиваюсь с тем, что кажется конфликтом в моем сознании относительно того, как правильно (используя лучшие практики) расширить Sprite в LibGDX (или для этого вопроса, любой класс Sprite).

Что я хотел бы сделать

Я хотел бы создать класс, Ship.java, со следующим конструктором:

// Note the lack of a Texture object in the constructor here
public Ship(float startingX, float startingY){

    super(new Texture(Gdx.files.internal("data/ship_texture.png")), 0, 0);

    this.startingX = startingX;
    this.startingY = startingY;

}

Почему я не могу сделать это

Во-первых, эта реализация заставляет меня потерять ссылку на Texture, что я перехожу в супер-конструктор. Это означает, что я не могу правильно dispose() позже, что впоследствии приведет к утечке памяти в коде.

Проблема

Поскольку конструктор класса Sprite заставляет указать Texture, и я бы хотел, чтобы Ship до always имел тот же ---- +: = 8 =: + ---- (поэтому не хотелось бы указывать его в конструкторе Texture), я ограничился взломом какого-либо фабричного метода для создания Ship.

Мое текущее решение

Как указано выше, в настоящее время у меня есть заводский метод, который создает Ship вместо использования конструктора.

Код

Ниже я подробно изложил код, который я использую для создания класса Ship. Не стесняйтесь критиковать его:

Ship

Почему мне не нравится это решение

Мне кажется, что это очень «хакерское» исправление, так как оно побеждает цель конструктора, и хотя статические заводские методы являются хорошей практикой, я не думаю, что необходимо будет внедрить новый заводский метод для каждый объект, который я планирую нарисовать на // Private constructor because I do not want this method to be called ever private Ship(Texture texture, int row, int column) { // Calls the super constructor (for the Sprite class) super(texture, row, column); } // Instead, this create method returns a new instance of Ship public static Ship create(int row, int column){ // Create the new texture Texture texture = new Texture(Gdx.files.internal("data/ship.png")); // Set the LINEAR filter (might switch to NEAREST later) texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); // Return a new instance of the Ship return new Ship(texture, row, column); } .


Мой вопрос

Каков наилучший способ расширить класс Screen (таким образом, сохраняя все вспомогательные методы, которые он предоставляет), и по-прежнему определять Sprite, который будет отображаться на объекте внутри конструктора Texture?

Является ли текущий подход подходящим?

5 голосов | спросил Squagem 25 MarpmMon, 25 Mar 2013 19:10:36 +04002013-03-25T19:10:36+04:0007 2013, 19:10:36

1 ответ


5

В игре, которую я разрабатываю, я использую централизованный AssetManager , который будет содержать ссылки и автоматически удалять их. Мне просто нужно загрузить файл pack и получить от него TextureAtlas. (или текстуры, если вы используете одиночные изображения вместо пакетов)

TextureAtlas atlas = game.assets.get("filename.pack", TextureAtlas.class);
jewelSprite = new JewelSprite(jewelType, atlas.findRegion("textureName")), game); 
// use `AtlasRegion` instead of `Texture`

Проверьте первую ссылку на хороший обзор AssetManager. Вам не нужно упаковывать текстуры, но рекомендуется для производительности.

ответил petervaz 25 MarpmMon, 25 Mar 2013 19:25:09 +04002013-03-25T19:25:09+04:0007 2013, 19:25:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132