使用TextureAtlas时,我可以使用Libgdx获得重复纹理吗?

时间:2014-08-01 16:33:02

标签: java libgdx textures texture-mapping

我正在使用TextureAtlas来组织我的所有图像,当我需要可以缩放以适合的纹理时,它会很有效。但是我想创建一个背景,它是TextureAtlas的一个区域重复多次,直到某个区域被填满。我已经尝试将TextureWrap设置为重复,如下所示:

public class Background extends Group {

SpriteActor bg;

public Background(int complexity) {
    bg = new SpriteActor("background");
    bg.getSprite().getTexture().setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
    bg.setSize(Match.TRACK_WIDTH,Match.TRACK_HEIGHT); //These constants equal 12000
    this.setSize(Match.TRACK_WIDTH,Match.TRACK_HEIGHT);
    this.addActor(bg);
}}

其中SpriteActor只是一个带有Sprite字段的Actor:

 public class SpriteActor extends Actor {

private Sprite sprite;

public SpriteActor(String assetName) {
    super();
    setSprite(new Sprite(Art.assets.findRegion(assetName)));
    setWidth(sprite.getWidth());
    setHeight(sprite.getHeight());
}
...

然而,图像仍然被拉伸以适合该区域(12000x12000像素),并且不再重复。我猜这是因为包装设置为纹理,它基本上包含TextureAtlas中的所有图像。我正在寻找的是一种可能只设置TextureRegion重复的方法。有没有办法可以同时使用TextureAtlas并重复我的图像?

1 个答案:

答案 0 :(得分:3)

如果图像是地图集的一部分,则必须绘制多个精灵以获得重复的效果。纹理包装不会产生任何影响,因为只有整个纹理的边缘在到达时会环绕,并且当您使用TextureAtlas时,您有多个图像共享相同的纹理。

因此,您可能会发现为此目的更容易将tilable图像分离为自己的纹理。在这种情况下,您需要将纹理包装模式设置为重复,除非直接在Texture实例上调用它。

然后有多种方法来绘制它。

如果你想使用一个精灵,首先要创建一个TextureRegion,它是从你的纹理构造的,并给出一个非常大的宽度和高度。我认为在你的情况下你会使用:

TextureRegion backgroundTextureRegion = new TextureRegion(backgroundTexture);
backgroundTextureRegion.setRegion(0f, 0f,
    Match.TRACK_WIDTH/(float)(backgroundTextureRegion.regionWidth),
    Match.TRACK_HEIGHT/(float)(backgroundTextureRegion.regionHeight));

然后你可以做

bg.getSprite().setTextureRegion(backgroundTextureRegion);

但如果您不想从地图集中分离纹理,则可以将Actor子类的draw方法设置为循环以反复绘制纹理区域。像这样:

public void draw (Batch batch, float parentAlpha) {
    for (int i=0; i<sceneWidth/bgTR.getWidth(); i++){
        for (int j=0; j<sceneHeihgt/bgTR.getHeight(); j++){
            batch.draw(bgTR, i*bgTR.getWidth(), j*bgTR.getHeight());
        }
    }
}

bgTR是地图集背景的纹理区域。