Java LibGdx如何重复背景?

Java LibGdx如何重复背景?,java,libgdx,Java,Libgdx,几天前,我发现了如何在LibGdx中进行滚动。现在我要做一些相关的事情。我想重复一下背景。我的滚动跟随一艘飞船(是一款s[ace ship game])。在背景中有一张作为纹理加载的空间照片。当飞船到达backgorund的末端时,它继续前进,不再有背景。我读过关于wrap的文章,但我真的不明白它是如何工作的。我做到了: px=new Pixmap(Gdx.files.internal("fondo.jpg")); background=new Texture(px);

几天前,我发现了如何在LibGdx中进行滚动。现在我要做一些相关的事情。我想重复一下背景。我的滚动跟随一艘飞船(是一款s[ace ship game])。在背景中有一张作为纹理加载的空间照片。当飞船到达backgorund的末端时,它继续前进,不再有背景。我读过关于wrap的文章,但我真的不明白它是如何工作的。我做到了:

    px=new Pixmap(Gdx.files.internal("fondo.jpg"));
    background=new Texture(px);
    background.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
然后,在我的渲染方法中

spriteBatch.begin();
    spriteBatch.draw(background,0,0,500,50);
    drawShip();
spriteBatch.end();
当然不起作用了,它只画了一次背景。我不知道如何让这个包装方法起作用。有什么帮助吗

解决方案 我想出来了。这不是一个好的代码,但它可以工作

首先,我声明两个具有相同图像的纹理

 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));
 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));
我还声明了两个这样的变量来指定每个bck位置的X值

 int posXBck1=0,posXBck2=0;
 int posXBck1=0,posXBck2=0;
然后我在Render()中使用它

其中:

ANCHODEFONDO是我背景的宽度

凸轮是一个凸轮

所以我说如果cam在bck2(这意味着你再也看不到bck1)中,它会改变位置,给bck1取消bck2的位置,并在下一个渲染循环中重新计算bck2

然后在渲染模式下绘制两个bck。

解决方案 我想出来了。这不是一个好的代码,但它可以工作

首先,我声明两个具有相同图像的纹理

 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));
 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));
我还声明了两个这样的变量来指定每个bck位置的X值

 int posXBck1=0,posXBck2=0;
 int posXBck1=0,posXBck2=0;
然后我在Render()中使用它

其中:

ANCHODEFONDO是我背景的宽度

凸轮是一个凸轮

所以我说如果cam在bck2(这意味着你再也看不到bck1)中,它会改变位置,给bck1取消bck2的位置,并在下一个渲染循环中重新计算bck2

然后只需在渲染中绘制两个bck()

bck1=new Texture(Gdx.files.internal("fondo.jpg"));
bck2=new Texture(Gdx.files.internal("fondo.jpg"));
这将加载两次大背景纹理。这完全是浪费。如果要保留解决方案,请至少执行以下操作:

bck1=new Texture(Gdx.files.internal("fondo.jpg"));
bck2=bkg1;
关于纹理包装。如果你的纹理是500px宽,并且你画了一个500px的精灵,你将看不到任何重复。如果你想重复它2次,请用0-2纹理坐标绘制它1000px宽。
我不确定spriteBatch如何处理您发布的呼叫,您可以尝试一下,也可以使用使用纹理区域的重载并手动设置区域。

我知道这是一个非常老的问题,但我认为有一种更简单的方法来完成背景滚动。只需使用Sprite类。下面是我用于分层备份的一个片段从右向左滚动的圆形图像

public class LevelLayer 
{
    public float speedScalar = 1;

    private List<Sprite> backgroundSprites = new ArrayList<Sprite>();

    public LevelLayer()
    {

    }

    public void addSpriteLayer(Texture texture, float startingPointX, float y, int repeats)
    {
        for (int k = 0; k < repeats; k++)
        {
          Sprite s = new Sprite(texture);
          s.setX(startingPointX + (k*texture.getWidth()));
          s.setY(y);

          backgroundSprites.add(s);
        }
    }

  public void render(SpriteBatch spriteBatch, float speed)  
  { 
    for (Sprite s : backgroundSprites)
    {
        float delta = s.getX() - (speed * speedScalar);
        s.setX(delta);

        s.draw(spriteBatch);
    }
  }
}

我在代码中随机更改背景重复部分,并在它们离开屏幕时创建新的部分或重置现有的部分。所有层都会进入一个池,并在需要新层时被随机抽取。

就像Teitus所说的,不要多次加载纹理。,永远!无论如何,你可以使用包装器在正确的轨道上:

texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
现在,您可以对源位置使用绘制方法。源位置是您选择在纹理上绘制的区域

batch.draw(texture, x, y, srcX, srcY, srcWidth, srcHeight)
要从右向左滚动你的纹理,你所要做的就是递增地增加srcX。所以在update/render方法中创建一个递增的int

int sourceX = 0;

//render() method

//Increment the variable where to draw from on the image.
sourceX += 10;

//Simply draw it using that variable in the srcX.    
batch.draw(YourTexture, 0, 0, sourceX, 0, screenWidth, screenHeight);

因为你正在包装纹理,所以它将无限期地包装/循环和滚动。如果游戏运行很长时间,可能会出现sourceX int问题,因为int只能容纳2147483647。这需要一段时间,但你可以通过每次数字超过总图像宽度时减去图像宽度来修复它。

如果你找到了解决方案,请将其作为答案发布。您的代码将在bck2中给出bck1的指针,如果您移动bck2,它将移动bck1。如果您可以“移动”纹理,则是这样(请参阅api,它没有位置/变换)。这是由sprite批处理的-注意,位置通过参数传递给spriteBatch。注意-如果使用TextureRegion绘制,则应另外将TextureRegion的宽度/高度设置为较大的值,以实现所需的重复行为。我认为仅使用一次纹理,并将两个不同的纹理区域设置为m同样的质地就足够了。