LibGDX从Hashmap中旋转精灵

时间:2016-07-26 19:58:32

标签: java mobile libgdx rotation sprite

我对libGDX和java一般都是新手,所以我一直在关注大量的教程。所以每次转动都要随意纠正我! (即使在代码效率低下也是如此!!)

我目前遇到旋转单个类型的所有精灵而不只是一个精灵的问题。

我会告诉你我的意思:

libGDX sprite rotation issue

以下是具体细节:

  1. 有3种不同大小的精灵。

  2. 我使用hashmap存储3个sprite,所以每次都不需要Sprite sprite = new Sprite();(据说这是一个繁重的任务)

  3. 我通过引用hashmap中的一个来创建一个sprite(我想?)

  4. 问题:当我告诉特定的精灵旋转时,它会相互旋转 大小的精灵。

  5. 我怀疑我正在旋转hashmap引用...如果这是说出它的正确方法。

    这是我一直在使用的过程:

    hashpmap:

    final HashMap<String, Sprite> spriteMap = new HashMap<String, Sprite>();
    

    纹理图集:

    spriteAtlas = new TextureAtlas("sprites.txt");
    

    使用纹理图集中的区域填充hashmap:

    private void init spriteMap() {
        Array<AtlasRegion> regions = spriteAtlas.getRegions();
    
        for (int i = 0; i < regions.size; i++) {
            AtlasRegion region = regions.get(i);
            Sprite sprite = spriteAtlas.createSprite(region.name);
    
            float width = sprite.getWidth() / SCALE;
            float height = sprite.getHeight() / SCALE;
    
            sprite.setSize(width, height);
            sprite.setOrigin(0, 0);
            sprite.scale(1f);
            spriteMap.put(region.name, sprite);
        }
    }
    

    从hashmap创建精灵“实例”:

    private void createNewSprite() {
        Sprite sprite;
        sprite = spriteMap.get(name);
        sprite.setPosition(x, y);
        sprite.rotate(rotation);
        spriteArray.add(sprite);
    }
    

    也许我实际上并没有从hashmap中充分推断sprite? 如果你还需要其他任何东西来解决这个难题,请告诉我。

    非常感谢你!

1 个答案:

答案 0 :(得分:0)

您只为每个地区名称创建了一个精灵,并在spriteArray中多次引用它。每次创建一个新的:

private void createNewSprite() {
    Sprite sprite = new Sprite(spriteMap.get(name)); //creates a new sprite that is a copy of the one in your map.
    sprite.setPosition(x, y);
    sprite.rotate(rotation);
    spriteArray.add(sprite);
}

他们只是略显沉重。每个Sprite实例都有一个包含20个浮点数组的数组,用于顶点数据,包含底层TextureRegion的冗余UV数据,以及冗余的Color对象和Rectangle对象。因此,它比创建自己的类更重,引用所有这些东西而没有冗余。

他们太沉重,无法在游戏过程中创造和摧毁其中的许多游戏而不使用游泳池。

真正重要的是加载新的纹理来创建你的精灵而不是它们共享一个纹理实例。

在我看来,Libgdx Sprites通常不适合游戏设计,因为除了裁员之外,他们将状态与绘图混为一谈。它们对于粒子(也许是UI元素)很有用,其中混淆不是真正的设计问题。事实上,我认为这些只是Sprite在Libgdx内部使用的两个地方。