This is the code I use in Renoria to render parallax, “infinite” repeating backgrounds:
private void renderBackground(RenderSpace g, int absolutex, int absolutey) {
int hs = getHorizontalSpacing(), vs = getVerticalSpacing();
if (this.horizontalRenderMode == RenderMode.STRETCH) {
if (this.verticalRenderMode == RenderMode.STRETCH) {
g.drawSprite(background, absolutex, absolutey, width, height, null);
} else if (this.verticalRenderMode == RenderMode.TILE) {
for (int i = ((absolutey) % vs) - vs; i < Core.view_RenderY + vs + Core.GameHeight; i += vs) {
g.drawSprite(background, absolutex, i);
}
} else if (verticalRenderMode == RenderMode.NONE) {
g.drawSprite(background, absolutex, absolutey, width, vs);
} else {
throw new Error();
}
} else if (this.verticalRenderMode == RenderMode.STRETCH) {
if (this.horizontalRenderMode == RenderMode.TILE) {
for (int i = ((absolutex) % hs) - hs; i < Core.view_RenderX + hs + Core.GameWidth; i += hs) {
g.drawSprite(background, i, absolutey);
}
} else if (horizontalRenderMode == RenderMode.NONE) {
g.drawSprite(background, absolutex, absolutey, hs, height);
} else {
throw new Error();
}
} else if (this.horizontalRenderMode == RenderMode.TILE) {
if (this.verticalRenderMode == RenderMode.TILE) {
for (int i = ((absolutex) % hs) - hs; i < Core.view_RenderX + hs + Core.GameWidth; i += hs) {
for (int j = ((absolutey) % vs) - vs; j < Core.view_RenderY + vs + Core.GameHeight; j += vs) {
g.drawSprite(background, i, j);
}
}
} else if (this.verticalRenderMode == RenderMode.NONE) {
for (int i = ((absolutex) % hs) - hs; i < Core.view_RenderX + Core.GameWidth + hs; i += hs) {
g.drawSprite(background, i, absolutey);
}
} else if (this.verticalRenderMode == RenderMode.STRETCH) {
for (int i = ((absolutex) % hs) - hs; i < Core.view_RenderX + hs + Core.GameWidth; i += hs) {
g.drawSprite(background, i, absolutey, hs, height);
}
} else {
throw new Error();
}
} else if (this.verticalRenderMode == RenderMode.TILE) {
if (this.horizontalRenderMode == RenderMode.NONE) {
for (int i = ((absolutey) % vs) - vs; i < Core.view_RenderY + vs + Core.GameHeight; i += vs) {
g.drawSprite(background, absolutex, i);
}
}
} else if (horizontalRenderMode == RenderMode.NONE && verticalRenderMode == RenderMode.NONE) {
g.drawSprite(background, absolutex, absolutey, null);
} else {
throw new Error();
}
}
In particular:
if (this.verticalRenderMode == RenderMode.TILE) {
for (int i = ((absolutex) % hs) - hs; i < Core.view_RenderX + hs + Core.GameWidth; i += hs) {
for (int j = ((absolutey) % vs) - vs; j < Core.view_RenderY + vs + Core.GameHeight; j += vs) {
g.drawSprite(background, i, j);
}
}
}