@patrick246, @Koschi
Dieser Ansatz ist für meine Zwecke leider nicht so gut geeignet. Zum einen sind die scrollenden Texturen relativ groß und zum anderen werden sie auch nur sehr langsam gescrollt (pixelweise). Damit eine Frameanimation unter diesen Bedingungen flüssig abliefe, bräuchte ich also ausgesprochen viele Frames und dementsprechend auch eine riesige Textur.
@KeksX
Die Sprites für die Hintergrundgrafiken (wie z.B. Wolken) füllen in ihrer Breite das gesamte Level aus (die Texturen werden horizontal über das TextureRect gekachelt). Sie überlappen also den gesamten Bildschirm, falls du das damit gemeint hast. In der Tat hätte ich die Sprites einfach nur doppelt so breit wie das Level machen müssen und hätte sie dann ganz bequem anstatt der TextureRects verschieben können. Leider ist mir dieser Einfall nicht gekommen.
---
Jetzt habe ich es mit einem Shader gelöst und damit läuft es auch prima. So schaut der Fragment-Shader aus:
|
Quellcode
|
1
2
3
4
5
6
7
8
|
uniform sampler2D texture;
uniform vec2 scrollOffset;
void main()
{
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy + scrollOffset);
gl_FragColor = gl_Color * pixel;
}
|
Und so wende ich ihn an:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
void Background::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const
{
m_scrollShader->setParameter("scrollOffset", m_scrollOffset);
states.shader = m_scrollShader;
target.draw(m_sprite, states);
}
|
Mich wundert nur, dass ich hier den
texture-Parameter nicht explizit setzen musste, obwohl im Handbuch steht, dass das notwendig sei.
Vielleicht kann mir jemand sagen, warum das so ist?