4

我有一张图片:background.png。如何使用 android OpenGL ES 或 AndEngine 库或您知道的其他技术创建连续重复的滚动背景图像?

例子:
移动的云

目前,我使用两个相邻图像技术。我两次加载图像(background.png)并将它们相邻放置,然后移动它们。所以它看起来只是一个连续滚动的图像。

但是,不知何故,我认为仅使用一个图像实例可能会有更好的解决方案。任何人都可以分享吗?

更新
对于好奇的人,这是两个相邻的图像代码(使用 AndEngine 库):

movingBackgroundSprite.registerEntityModifier(new LoopEntityModifier(
    new MoveYModifier(10, -CAMERA_HEIGHT, 0)));     
movingBackgroundSprite2.registerEntityModifier(new LoopEntityModifier(
    new MoveYModifier(10, 0, CAMERA_HEIGHT)));

上面的代码是关于重复制作背景图像并从上到下垂直滚动。

注意:
*movingBackgroundSprite 是一个加载 background.png 图像的 Sprite 类。您可以看到背景 Sprite 有两个实例。
* registerEntityModifier -> 为 Sprite 应用修改器/行为
* LoopEntityModifier -> 循环行为
* MoveYModifier -> 通过 y 位置移动行为。第一个参数是持续时间(你可以忽略它,因为它与问题无关),第二个参数是 Source-Y 位置,第三个参数是 Destination-Y 位置。
* CAMERA_HEIGHT -> 定义背景图像高度的常量。

4

2 回答 2

4

如果您已经设置glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)(我认为这是默认设置),您可以绘制一个全屏四边形并s以小步长增加纹理坐标(如果您愿意,它也可以垂直工作)。

大于 1.0 的值将包裹在纹理的左侧,不需要额外的东西。而且,不需要两次绘制调用。

你没有说你是 ES 1.0 还是 2.0,但如果它是 2.0,你可以将偏移作为统一传递,并将其添加到着色器中的纹理坐标,这比每次更改顶点数据 (texcoord) 更有效框架。虽然是每帧一次的东西,但它可能无论如何都无关紧要,它可能只是一样的。

编辑:
我不了解 AndEngine,可能有更简单、更方便的命令来绘制带纹理的全屏四边形......但是给定“OpenGL ES 1.0”,使用立即模式并假设默认 MVP 矩阵,这可能看起来像这样作为一个非常粗略的例子:

glBindTexture(GL_TEXTURE_2D, cloudy_sky_texture);
glTexImage(...);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
...
float offset = 0.0f;
while(!quit)
{
    offset += 1.0f/texture_size;

    glBindTexture(GL_TEXTURE_2D, cloudy_sky_texture);

    glBegin(GL_QUADS);
        glVertex2f(-1.0f, -1.0f);
        glTexCoord2f(0.0f + offset, 0.0f);
        ...
        glVertex2f(1.0f,  1.0);
        glTexCoord2f(1.0f + offset, 1.0f);
    glEnd();

    DrawForegroundStuff();
}

为简洁省略了一些行,立即模式不好,还有很大的优化空间,但原理应该清楚。您实际上只需要绘制一个四边形并增加s纹理坐标的分量。

于 2012-04-19T11:12:34.903 回答
1

您可能已经找到了答案,但以防万一其他 Andengine 游戏开发人员在使背景可滚动时感到困惑,我建议使用AutoParallaxBackground,因为它易于使用且高效。

要实现 AutoParallaxBackground,请执行以下步骤:

1)声明并初始化BitmapTextureAtlas和TextureRegion。

private BitmapTextureAtlas mAutoParallaxBackgroundTexture;
private TextureRegion background_region;
mAutoParallaxBackgroundTexture = new BitmapTextureAtlas(1024, 1024,TextureOptions.DEFAULT);
background_region= BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mAutoParallaxBackgroundTexture, this,"backgroundImg.png", 0, 0);

2)声明并初始化背景精灵和AutoParallaxBackground。

final AutoParallaxBackground auto_background = new AutoParallaxBackground(0, 0, 0, 5);         
final Sprite background_sprite = new Sprite(0,0, this.background_region,vbom);

3) 将 background_sprite 作为视差实体添加到 AutoParallaxBackground 对象。

auto_background.attachParallaxEntity(new ParallaxEntity(1.7f,background_sprite));

4)最后,将 AutoParallaxBackground 对象设置为您的场景背景。

your_scene.setBackground(auto_background);

希望这会在以后对某人有所帮助。

于 2015-06-24T08:21:56.877 回答