Java 在libgdx中复制纹理

Java 在libgdx中复制纹理,java,arrays,copy,libgdx,texture-atlas,Java,Arrays,Copy,Libgdx,Texture Atlas,在我的渲染器类中,我有两个动画对象类,它获取了一只猴子的两个动画文件:一个描述猴子向前移动,另一个描述猴子向右移动 现在,我正在尝试创建第三个动画对象,它将画出向左移动的猴子 我正在尝试翻转第二个动画的图像(monkey向右),并将它们添加到一个数组中,该数组最终将用作第三个对象的资源 问题是,当我翻转第二个动画的图像,然后添加它们时,原始动画对象被“损坏”。当我说损坏时,我的意思是包含向右移动的猴子图像的动画也突然“翻转”到了左侧,现在我有两个动画对象来描述向左移动的猴子 下面是代码中处理此问

在我的渲染器类中,我有两个动画对象类,它获取了一只猴子的两个动画文件:一个描述猴子向前移动,另一个描述猴子向右移动

现在,我正在尝试创建第三个动画对象,它将画出向左移动的猴子

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

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

下面是代码中处理此问题的部分:

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);
monkeyanimstright=新动画(1/20.0f,AssetsManager.getAsset(“animations/monkeywalkaway.txt”,TextureAtlas.class).getRegions());
monkeyanimstright.setPlayMode(Animation.PlayMode.LOOP_反转);
monkeyAnimRight=新动画(1/10.0f,AssetManager.getAsset(“animations/monkeywalk.txt”,TextureAtlas.class).getRegions());
monkeyAnimRight.setPlayMode(Animation.PlayMode.LOOP_反转);
数组temp=AssetsManager.getAsset(“animations/monkeywalk.txt”,TextureAtlas.class).getRegions();
Array keyFramesTemp=新数组();
关键帧映射添加全部(临时);
对于(AtlasRegion关键帧:keyFramesTemp){
关键帧翻转(真、假);
}
monkeyAnimLeft=新动画(1/20.0f,keyFramesTemp);
正如你所看到的,我正试图复制原始图像,这样它们就不会被翻转,但仍然不起作用


如何成功复制原始AtlasRegion阵列?

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

您需要复制纹理区域并创建新实例,而不是修改纹理区域的原始实例。简单地将它们放入一个新数组并不会复制它们。新数组仍在引用相同的原始实例

这样做:

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 );
Array monkeyWalkRightRegions=AssetsManager.getAsset(“animations/monkeywalk.txt”,TextureAtlas.class).getRegions();
monkeyAnimRight=新动画(1/10.0f,monkeyWalkRightRegions);
monkeyAnimRight.setPlayMode(Animation.PlayMode.LOOP_反转);
数组monkeyWalkLeftRegions=新数组();
//复制然后翻转每个区域并将其添加到新阵列中
对于(纹理区域关键帧:monkeyWalkRightRegions){
TextureRegion region=新的TextureRegion(关键帧);//创建的区域副本
区域。翻转(真、假);
monkeyWalkLeftRegions.add(region);
}
monkeyAnimLeft=新动画(1/20.0f,monkeyWalkLeftRegions);

在内存管理方面,这是否意味着我必须做任何额外的工作以确保没有任何内存泄漏?它将如何影响性能?不。最终,所有这些额外的纹理区域都引用相同的纹理实例。只有一个纹理副本加载到本机内存中,所以在完成动画时,只需要处理一个纹理。停止引用动画后,GC将处理纹理区域。不知道你说的性能是什么意思。由于额外的阵列,内存使用稍微多一些,但并不多。你的记忆瓶颈将是实际的纹理和声音。明白!谢谢你的解释!