java - LibGdx 如何重复背景?

标签 java libgdx

几天前,我想出了如何在 LibGdx 中进行滚动。现在我正在尝试做一些相关的事情。我想重复背景。我的滚动跟随一艘船(是一个 s[ace 船游戏)。在背景中有一张空间照片作为纹理加载。当船到达背景的尽头时,它继续前进,没有背景了。我读过有关 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"));

另外我声明了两个这样的变量来指定每个bck位置的X值

 int posXBck1=0,posXBck2=0;

然后我在 Render() 中使用它

 public void calculoPosicionFondos(){
    posXBck2=posXBck1+ANCHODEFONDO;
    if(cam.position.x>=posXBck2+cam.viewportWidth/2){
        posXBck1=posXBck2;
    }
}

地点:

ANCHODEFONDO 是我背景的宽度

Cam 是一个 OtrhoCam。

所以我说过,如果凸轮在 bck2 中(这意味着您再也看不到 bck1),它会改变位置,使 bck1 失去 bck2 的位置,并在下一个渲染循环中重新计算 bck2

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

最佳答案

正如 Teitus 所说,永远不要多次加载您的纹理!不管怎样,你在 wrapper 的正确轨道上:

texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);

现在您可以只对源位置使用 draw 方法。源位置是您选择在纹理上绘制的区域。

batch.draw(texture, x, y, srcX, srcY, srcWidth, srcHeight)

要从右向左滚动纹理,您所要做的就是逐渐增加 srcX。因此,创建一个在更新/渲染方法中递增的 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。这需要一段时间,但您可以通过每次数字超过总图像宽度时减去图像宽度来修复它.

关于java - LibGdx 如何重复背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603759/

相关文章:

java - 在考虑业务需求变化的情况下,POJO/模型或领域驱动对象的本质到底是什么?

java - 如何处理 PreparedStatement 中的(可能)空值?

libgdx - 多种分辨率的不同纹理

java - 使用 Box2D(ligdx 修改)类在 Libgdx 中创建一个 polygonShape,但该对象没有碰撞

java.lang.NoClassDefFoundError : sun/security/ssl/HandshakeStateManager

java - 每次调用 "Camera camera = Camera.open();"时 Android 都会抛出错误

Java 将 ArrayList 转换为 C#

java - libgdx 中的声音问题

java - Sprite 设置纹理不起作用

java - 更新循环更新对象而不是删除它