Basicamente, eu criava um mapa de blocos 2x2, onde os blocos eram 512x512 e todos iguais. Role-o como faria normalmente, mas assim que X exceder 512 subtraia 512 (ou faça um módulo 512 - mas tenha cuidado com números negativos), o mesmo para Y. Então, em vez de um poli, você desenha 4, embora apenas 1 seja visível na maioria das vezes, mas em casos de fronteira todos os 4 são visíveis (quando você desce 400 e 400 à direita, por exemplo). Dessa forma, ele deve rolar para sempre.
Claro que você também pode usar 4 sprites em vez de um mapa de blocos. Um no worldPos, um no worldPos + (512,0), um no worldPos + (0,512) e um no worldPos + (512,512).
Verifique se o worldPos está sempre no módulo 512 e, novamente, deve rolar para sempre.
Editado para adicionar código: Não
testado, sem sintaxe marcada.
Muito codificado para resolver este problema. Seria melhor com uma matriz real para um mapa, mas para esse problema específico, isso deve funcionar.
Assume 0,0 como o canto superior esquerdo da tela.
void DrawBG( int worldX, int worldY)
{
const int tileW = 512;
const int tileH = 320;
int worldXMod = worldX % tileW;
if (worldXMod < 0) worldXMod += tileW; // handle negative numbers
int worldYMod = worldY % tileH;
if (worldYMod < 0) worldYMod += tileH; // handle negative numbers
int tileLeft = -worldXMod;
int tileTop = -worldYMod;
int spriteTopLeftY = tileLeft;
int spriteTopLeftY = tileTop;
int spriteTopRightX = spriteTopLeftX + tileW;
int spriteTopRightY = spriteTopLeftY;
int spriteBottomLeftX = spriteTopLeftX;
int spriteBottomLeftY = spriteTopLeftY + TileH;
int spriteBottomRightX = spriteTopRightX;
int spriteBottomRightY = spriteBottomLeftY;
// whatever the syntax of sprite drawing or setting its position is...
DrawSprite(spriteTopLeftX, spriteTopLeftY);
DrawSprite(spriteTopRightX, spriteTopRightY);
DrawSprite(spriteBottomLeftX, spriteBottonLeftY);
DrawSprite(spriteBottomRightX, spriteBottomRightY);
}