2012-04-19 36 views
4

我有一个图像:background.png。如何使用android OpenGL ES或AndEngine库或其他技术创建连续重复的滚动背景图像?如何在Open GL中创建连续重复的滚动背景图像?

实施例:
moving cloud

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

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

UPDATE
对于一个谁好奇,这是(使用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

如果您设置了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分量。

+0

嗨,你能提供一些示例代码吗?我正在使用OpenGL ES 1.0。 – null 2012-04-19 12:27:47

+0

嗨,thx代码示例。对此,我真的非常感激。理解代码并使用AndEngine尝试它可能需要很多次。 – null 2012-04-23 09:03:35

+0

如果浮点值换行会发生什么? – paulm 2013-11-22 11:59:29

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); 

希望这会稍后帮助某人。