Como criar um fundo de rolagem sem fim?

8

Preciso adicionar um fundo de rolagem ao meu jogo, a imagem é 512x512px. É para um jogo de carros com tráfego de mão dupla e eu quero poder atravessar para o lado oposto e dirigir contra o tráfego também. O jogo está no modo retrato e eu uso o cocos2d.

Como posso fazer isso da melhor maneira possível?

David Holmes
fonte
O fundo será agrupado ao longo de xey ou apenas em uma direção?
Ricket 12/08/10
Também quais são as dimensões da tela? Ou seja, a tela sempre será menor que 512x512?
Ricket 12/08/10

Respostas:

7

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);
}
Kaj
fonte
No caso do módulo, números negativos não são um problema (pelo menos para Objective-C; em Java, eles são).
Ricket 12/08/10
Mesmo? Ok ... depende da máquina, acho que o iPhone é abençoado. Não toca no Objective-C há um ano e meio.
Kaj 12/08
Bem, na verdade, para ser sincero, ainda não tentei no Objective-C. Estou fazendo um palpite com base no fato de que o AFAIK Java é o único onde% não é módulo, é "restante". Qualquer outra linguagem que eu vi lida com% como módulo; -1% 3 deve ser 2. Mas em Java, é 1. Eu não testei literalmente o Objective-C, mas se ele se comportar como deveria, então -1% 3 é 2 e, de fato, o módulo funcionará corretamente mesmo para números negativos.
Ricket 12/08/10
Não, em C é (aparentemente, com preguiça de verificar o padrão nesta hora ímpia) dependente da máquina. Acabei de verificar no meu laptop que -5% 3 é igual a -2.
Kaj
Alguém pode postar algum código, por favor, todos esses números me deixam tonto. Estou desenvolvendo há quase 3 meses, então ainda não sou especialista. Eu gostei da maneira como Kaj falou sobre os 4 sprites, parece a maneira mais fácil. Você pode me mostrar um exemplo de código para isso? Aprendo mais rápido olhando o código e brincando com ele. Alterei o tamanho da imagem para 512x320px. Alguém pode me ajudar, por favor? David
David Holmes
2

Se eu entendi direito, você pode criar um conjunto de imagens. Cada imagem tem um ponto de entrada e um ponto de saída. Para facilitar as coisas, você pode criar todos os pontos de entrada e sair no mesmo local. Em seguida, você pode alternar aleatoriamente entre imagens diferentes para que o player não encontre um nível completamente redundante. Se você quiser misturar um pouco as coisas, poderá criar imagens com entradas e saídas diferentes. Você precisará apenas trabalhar um pouco mais para garantir que a saída de uma imagem corresponda à entrada da próxima imagem.

zooropa
fonte