I'm writing a 2D platformer game on Java
with LWJGL
. I'm doing this just for the sake of learning and not the result itself, so when I decided to implement scrolling I did it two ways I could invent myself:
- Three "sky" rectangle entities that located in a row and when my camera is moved to the right (fully on third), I move my first rectangle (from the far left) to the far right, etc. Pretty sure it can be made that way only with two entities, but I didn't have enough motivation to do it right now.
- Not infinite, but you can just stack these Sky entities in a row for the whole level width. Very lame approach.
But I realised that to optimize it, I can move not the "canvas", but the "painting" on the "canvas" itself. So, is it possible to move it this way? I'm not entirely sure that's possible at all, but I think it should be. How I see it: I change not position.x
or position.y
, but the texture coordinates, they should repeat, aren't they?
My code, if that will be helpful anyway. Render function in Main class:
private void render() {
setupGL();
GL11.glPushMatrix();
GL11.glTranslatef(-Camera.x, -Camera.y, 0.0f);
GL11.glScissor(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
sky.draw();
GL11.glPopMatrix();
}
Draw function of the Sky entity, and yes, I know that immediate mode is bad, but I still haven't got my hands on arrays and other drawing methods.
public void draw() {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, TextureWrapper.get(EntityTypes.SKY).getTextureID());
GL11.glColor3f(1.0f, 1.0f, 1.0f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0.0f, 1);
GL11.glVertex2f(this.x, this.y + this.height);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(this.x + this.width, this.y + this.height);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(this.x + this.width, this.y);
GL11.glTexCoord2f(0.0f, 0);
GL11.glVertex2f(this.x, this.y);
GL11.glEnd();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}