【问题标题】:Copy texture in libgdx在 libgdx 中复制纹理
【发布时间】:2014-10-24 19:21:15
【问题描述】:

我的 Renderer 类中有 2 个 Animation 类的对象,它们包含 2 个猴子动画文件:一个描绘猴子向前走,另一个描绘右侧。

现在,我正在尝试创建第三个动画对象,以绘制向左移动的猴子。

我正在尝试翻转第二个动画的图像(猴子向右)并将它们添加到一个数组中,该数组最终将用作第三个对象的资源。

问题是当我翻转第二个动画的图像然后添加它们时,原始动画对象被“损坏”。当我说损坏时,我的意思是包含猴子向右走的图像的动画突然也“翻转”到左侧,现在我有 2 个动画对象描述了向左走的猴子。

这是处理它的代码部分:

monkeyAnimStraight = new Animation(1/20.0f, AssetsManager.getAsset("animations/monkeywalkaway.txt", TextureAtlas.class).getRegions());
        monkeyAnimStraight.setPlayMode(Animation.PlayMode.LOOP_REVERSED);
        monkeyAnimRight = new Animation(1/10.0f, AssetsManager.getAsset("animations/monkeywalk.txt", TextureAtlas.class).getRegions());
        monkeyAnimRight.setPlayMode(Animation.PlayMode.LOOP_REVERSED);
        Array<AtlasRegion> temp = AssetsManager.getAsset("animations/monkeywalk.txt", TextureAtlas.class).getRegions();
        Array<AtlasRegion> keyFramesTemp = new Array<TextureAtlas.AtlasRegion>();
        keyFramesTemp.addAll(temp);
        for(AtlasRegion keyFrame : keyFramesTemp) {
            keyFrame.flip(true, false);
        }
        monkeyAnimLeft = new Animation(1/20.0f, keyFramesTemp);

如您所见,我正在尝试复制原始图像,这样它们就不会被翻转,但它仍然不起作用。

如何成功复制原始 AtlasRegion 数组?

【问题讨论】:

    标签: java arrays copy libgdx texture-atlas


    【解决方案1】:

    如果您不想弄乱原始纹理区域,请创建新纹理区域。请注意,AtlasRegions 是 TextureRegions 的子类,但您的动画真正需要的是 TextureRegions。

    您无需修改​​ TextureRegions 的原始实例,而是需要复制它们并创建新实例。简单地将它们放到一个新数组中并不会复制它们。新数组仍然引用相同的原始实例。

    这样做:

    Array<TextureRegion> monkeyWalkRightRegions = AssetsManager.getAsset("animations/monkeywalk.txt", TextureAtlas.class).getRegions();
    monkeyAnimRight = new Animation(1/10.0f, monkeyWalkRightRegions);
    monkeyAnimRight.setPlayMode(Animation.PlayMode.LOOP_REVERSED);
    
    Array<TextureRegion> monkeyWalkLeftRegions = new Array<TextureRegion>();
    
    //copy and then flip each region and add it to the new array
    for(TextureRegion keyFrame : monkeyWalkRightRegions ) {
        TextureRegion region = new TextureRegion(keyFrame); //copy of region created
        region.flip(true, false);
        monkeyWalkLeftRegions.add(region);
    }
    
    monkeyAnimLeft = new Animation(1/20.0f, monkeyWalkLeftRegions );
    

    【讨论】:

    • 在内存管理方面,这是否意味着我必须做任何额外的事情来确保我没有任何内存泄漏?它将如何影响性能?
    • 不。最终,所有这些额外的 TextureRegions 都引用了相同的 Texture 实例。仅在本机内存中加载了一个纹理副本,因此在完成动画后只需要处理一个纹理。在您停止引用动画后,GC 将处理 TextureRegions。不知道你说的性能是什么意思。由于额外的数组,内存使用量略有增加,但并不多。您的内存瓶颈将是实际的纹理和声音。
    • 明白!谢谢你的解释!
    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多