纹理图集纹理查找区域或创建精灵

时间:2014-06-02 02:41:23

标签: libgdx

我正在尝试从Texture Atlas创建的Sprite或Atlas Region获取纹理。

    atlas=new TextureAtlas(Gdx.files.internal("Test.pack"));
    region=atlas.findRegion("green");

 Sprite s = atlas.createSprite("red");
 texture = s.getTexture();      

我在findRegion和createSprite方法中给出了图像的名称,它总是选择其他图像对象。我想获得图像的纹理,以便可以渲染该纹理的一部分。

这是Packer图片: http://i61.tinypic.com/neupo2.png

即使我尝试获得绿色区域或红色,它也总是返回蓝色。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

当你执行“textureAtlas.findRegion(”objectTexture“)。getTexture();” (来自James Skemp的回答)你从地图集中得到了整个纹理,而不仅仅是来自“objectTexture”的区域。

不要费心创建纹理来创建Sprite,你可以使用TextureRegion来创建Sprite。像这样:

atlas=new TextureAtlas(Gdx.files.internal("Test.pack"));
regionGreen=atlas.findRegion("green");
Sprite s = new Sprite(regionGreen);

答案 1 :(得分:0)

我的用例略有不同,但我遇到了同样的问题。

我有一个扩展Actor的对象,我希望使用地图册中的某个区域进行绘制。

public class MyObject extends Actor {
    private Texture texture;

    public MyObject() {
        TextureAtlas textureAtlas = new TextureAtlas(Gdx.files.internal("xxx.atlas"));
        texture = textureAtlas.findRegion("objectTexture").getTexture();
        Gdx.app.log(TAG, "Texture width: " + texture.getWidth());
        Gdx.app.log(TAG, "Texture height: " + texture.getHeight());

        setBounds(getX(), getY(), Constants.STANDARD_TILE_WIDTH, Constants.STANDARD_TILE_HEIGHT);
        // ...
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        batch.draw(texture,
                worldPosition.x * Constants.STANDARD_TILE_WIDTH, worldPosition.y * Constants.STANDARD_TILE_WIDTH,
                texture.getWidth(), texture.getHeight());
    }
}

而不仅仅是我期待的区域,而是收到了整个地图集,因此我记录的纹理宽度和高度为1024 x 128。

不幸的是,仍然不确定为什么getTexture()返回太多,但切换到batchDraw(TextureRegion, ...)至少让我处于更好的位置。

public class MyObject extends Actor {
    private TextureRegion texture;

    public MyObject() {
        TextureAtlas textureAtlas = new TextureAtlas(Gdx.files.internal("xxx.atlas"));
        texture = textureAtlas.findRegion("objectTexture");

        setBounds(getX(), getY(), Constants.STANDARD_TILE_WIDTH, Constants.STANDARD_TILE_HEIGHT);
        // ...
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        batch.draw(texture, getX(), getY());
    }
}

根据我对精灵的看法,提问者看到了一个蓝色正方形,原因与我相同;整个图像被getTexture()加载,因为它从左下角开始,你总是看到一个蓝色方块。

使用Sprite(TextureRegion)构造函数可能也解决了他们的问题。

答案 2 :(得分:0)

对我来说,你的问题是Test.pack文件,而不是纹理。

它适用于我用GDX Texture Packer打包的那个:

Test.png format: RGBA8888 filter: Nearest,Nearest repeat: none blue rotate: false xy: 1, 1 size: 51, 51 orig: 51, 51 offset: 0, 0 index: -1 green rotate: false xy: 54, 1 size: 51, 51 orig: 51, 51 offset: 0, 0 index: -1 red rotate: false xy: 107, 1 size: 51, 51 orig: 51, 51 offset: 0, 0 index: -1 yellow rotate: false xy: 160, 1 size: 51, 51 orig: 51, 51 offset: 0, 0 index: -1

答案 3 :(得分:-1)

使用索引来获取它。从包文件或.atlas文件中获取索引。

atlas=new TextureAtlas(Gdx.files.internal("Test.pack"));
    region=atlas.findRegion("green",index);

 Sprite s = atlas.createSprite("red",index);
 texture = s.getTexture();