我正在使用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并重复我的图像?
答案 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
是地图集背景的纹理区域。