Java 将精灵表中的精灵存储在数组Libgdx中

Java 将精灵表中的精灵存储在数组Libgdx中,java,android,arrays,libgdx,sprite-sheet,Java,Android,Arrays,Libgdx,Sprite Sheet,在我的Libgdx安卓资产中,960x960 spritesheet以png格式存储。在我为初始化游戏中使用的精灵而指定的一个类中,我试图使它从精灵表中剪切出一个120x120的精灵(因此数组中应该有64个项目)。我怎样才能做到这一点?这是我在类似情况下尝试过的: public static Texture spritesheet; public static Sprite[] textures = new Sprite[64]; ... //inside method that get

在我的Libgdx安卓资产中,960x960 spritesheet以png格式存储。在我为初始化游戏中使用的精灵而指定的一个类中,我试图使它从精灵表中剪切出一个120x120的精灵(因此数组中应该有64个项目)。我怎样才能做到这一点?这是我在类似情况下尝试过的:

public static Texture spritesheet;
public static Sprite[] textures = new Sprite[64];
...
    //inside method that gets called once to initialize variables
    spritesheet = new Texture(
            Gdx.app.getType() == Application.ApplicationType.Android ?
                    "...Spritesheet.png" :
                    "android/assets/...Spritesheet.png"
    );
    spritesheet.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);

    for (int x = 0; x < 64; x ++) {
        textures[x] = new Sprite(spritesheet, x, (x%8), 64, 64);
        textures[x].flip(false, true);
    }

当我这样做的时候,它的行为真的很奇怪。它说数组中填充了元素,但仍然存在数组索引超出边界的异常,或者精灵只是疯狂地渲染。总的来说,这是行不通的。我要做的是使它不必分别初始化64个不同的精灵,并且使它可以通过更改渲染精灵时输入的索引来轻松更改精灵,以便以后可以执行其他操作,如动画。我该怎么做呢?

我想你的for循环应该是这样的

for(int x = 0; x < 64; x ++){
    textures[x] = new Sprite(
        spritesheet, 
        (x%8)*64, //where x=3, (3%8)*64 = 3*64 = 192px sourceX
        (x/8)*64, //where x=3, (int)(3/8)*64 = 0*64 = 0px sourceY
        64, //source width
        64 //source height
    );


Another test case where x=20;
(20%8)*64 = 4*64 = 256px SourceX
(20/8)*64 = 2*64 = 128px SourceY
for(int x=0;x<64;x++){
纹理[x]=新精灵(
雪碧片,
(x%8)*64,//其中x=3,(3%8)*64=3*64=192px源x
(x/8)*64,//其中x=3,(int)(3/8)*64=0*64=0px sourceY
64,//源宽度
64//震源高度
);
另一个测试用例,其中x=20;
(20%8)*64=4*64=256px源X
(20/8)*64=2*64=128px源

我认为您的for循环应该是这样的

for(int x = 0; x < 64; x ++){
    textures[x] = new Sprite(
        spritesheet, 
        (x%8)*64, //where x=3, (3%8)*64 = 3*64 = 192px sourceX
        (x/8)*64, //where x=3, (int)(3/8)*64 = 0*64 = 0px sourceY
        64, //source width
        64 //source height
    );


Another test case where x=20;
(20%8)*64 = 4*64 = 256px SourceX
(20/8)*64 = 2*64 = 128px SourceY
for(int x=0;x<64;x++){
纹理[x]=新精灵(
雪碧片,
(x%8)*64,//其中x=3,(3%8)*64=3*64=192px源x
(x/8)*64,//其中x=3,(int)(3/8)*64=0*64=0px sourceY
64,//源宽度
64//震源高度
);
另一个测试用例,其中x=20;
(20%8)*64=4*64=256px源X
(20/8)*64=2*64=128px源

为此,您应该使用TextureAtlas。atlas是由LibGDX TexturePacker从单独的图像自动生成的文件。它存储从工作表中的图像边界到
NinePatch
信息的所有内容。您只需将单独的图像放在一个文件夹中,然后在该文件夹上运行TexturePacker。This将为您创建一个易于加载的工作表和.atlas/.pack文件

如果你在命令行方面有困难,那么存在一个问题,但我建议你使用命令行,甚至在你的应用程序中使用它

我通常做的是在开发时动态创建这些工作表。我可以轻松覆盖单独的图像,它们在我再次运行应用程序后立即生效。我首先在项目根目录下创建一个新文件夹
images
。然后为我需要的每个包创建另一个文件夹。例如,我创建了文件夹
>在
images
中设置tileset
。在
DesktopLauncher
中,我将设置此文件夹以从图像生成地图集

    TexturePacker.Settings settings = new TexturePacker.Settings();
    settings.maxWidth = 1024;
    settings.maxHeight = 1024;
设置文件指定了有关图集的所有内容。如果要从图像、填充、旋转等中去除透明度,则为单张图纸的最大尺寸。这些设置都非常简单,您可以在文档中查找这些设置。使用这些设置,您可以创建图集

    TexturePacker.process(settings, 
            "../../images/tileset", //where to find the images to be packed.
            "../../android/assets/tileset/", //where to store the atlas and sheet
            "tileset"); //what filename to use
现在您可以打开.atlas文件,看到它使用文件名作为别名。此别名用于查找它们,但让我们先加载atlas

TextureAtlas atlas = new TextureAtlas("tileset/tileset.atlas");
通过向构造函数传递一个字符串,默认情况下它会显示在本地路径中,而本地路径在
android/assets/
中是默认的。现在我们可以要求atlas在工作表中移交我们的资产

atlas.findRegion(“alias”);//交出名为“alias”的工作表上的图像

像这样查找纹理有点贵。你不想每次更新都查找像这样的纹理,所以你仍然需要将它们存储在某个地方

如果您将图像序列命名为
image\u 01.png
image\u 02.png
image\u 03.png
等,它将以相同的名称存储它们,并在图集中按
索引对它们进行排序。因此,如果您需要特定纹理的单独数组,可以使用
\u xx
对它们进行命名,然后一次性获得它们:

atlas.findRegions("alias");
这对于
动画
特别方便。只需将图像序列复制到一个文件夹并指定要打包。正确命名序列并为动画指定区域。一切都将立即工作

使用
AssetManager
加载
TextureAtlas
与普通的
纹理
几乎相同,只是您可以指定它来自
TextureAtlas.class
。您始终加载
.atlas
,然后处理图像

我总是使用
AssetDescriptor
来加载我的资源。如果我在哪里找到了你,我将摆脱静态
assets.textures[]


为此,您应该使用TextureAtlas。atlas是由LibGDX TexturePacker从单独的图像自动生成的文件。它存储从工作表中的图像边界到
NinePatch
信息的所有内容。您只需将单独的图像放在一个文件夹中,然后在该文件夹上运行TexturePacker。这将为您创建易于加载的工作表和.atlas/.pack文件

如果你在命令行方面有困难,那么存在一个问题,但我建议你使用命令行,甚至在你的应用程序中使用它

我通常做的是在开发时动态创建这些工作表。我可以轻松覆盖单独的图像,它们在我再次运行应用程序后立即生效。我首先在项目根目录下创建一个新文件夹
images
。然后为我需要的每个包创建另一个文件夹。例如,我创建了文件夹
>在
images
中设置tileset
。在
DesktopLauncher
中,我将设置此文件夹以从图像生成地图集

    TexturePacker.Settings settings = new TexturePacker.Settings();
    settings.maxWidth = 1024;
    settings.maxHeight = 1024;
设置文件指定了图集的所有内容。如果一张图集的最大尺寸应该从图像、填充、旋转等中去除透明度,那么它们都是非常直的
TextureAtlas tileset = assetManager.get(Assets.TileSet);