¿Cómo crear un fondo de desplazamiento sin fin?

8

Necesito agregar un fondo de desplazamiento a mi juego, la imagen es 512x512px. Es para un juego de autos con tráfico en dos direcciones y quiero poder cruzar hacia el lado opuesto y conducir contra el tráfico también. El juego está en modo vertical y yo uso cocos2d.

¿Cómo puedo hacer esto de la mejor manera posible?

David Holmes
fuente
¿El fondo se ajustará a lo largo de x e y, o solo en una dirección?
Ricket
Además, ¿cuáles son las dimensiones de la pantalla? Es decir, ¿la pantalla siempre será más pequeña que 512x512?
Ricket

Respuestas:

7

Básicamente, crearía un mapa de mosaicos de 2x2 donde los mosaicos son 512x512 y son todos iguales. Desplácese como lo haría normalmente, pero tan pronto como X supere 512 reste 512 (o haga un módulo 512, pero tenga cuidado con los números negativos), lo mismo para Y. Entonces, en lugar de un poli, dibuje 4, aunque solo 1 será visible la mayoría de las veces, pero en los casos fronterizos, los 4 son visibles (cuando baja 400 y 400 a la derecha, por ejemplo). De esta manera, debería desplazarse para siempre.

Por supuesto, también puede usar 4 sprites en lugar de un mapa de mosaico. Uno en worldPos, uno en worldPos + (512,0), uno en worldPos + (0,512) y uno en worldPos + (512,512).
Asegúrese de que worldPos sea siempre el módulo 512 y, de nuevo, debería desplazarse para siempre.

Editado para agregar un código:

probado, sin sintaxis comprobada.
Muy codificado para resolver este problema. Sería mejor con una matriz real para un mapa, pero para este problema específico esto debería funcionar.
Asume que 0,0 es la esquina superior izquierda de la pantalla.

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
fuente
En el caso del módulo, los números negativos no son un problema (al menos para Objective-C; en Java sí lo son).
Ricket
De Verdad? De acuerdo ... depende de la máquina, supongo que el iPhone está bendecido. No he tocado Objective-C en un año y medio.
Kaj
Bueno, en realidad, para ser honesto, no lo he probado en Objective-C. Estoy haciendo una suposición educada basada en el hecho de que AFAIK Java es el único donde% no es módulo, es "resto". Cualquier otro idioma que he visto maneja% like modulo; -1% 3 debería ser 2. Pero en Java, es 1. No he probado literalmente Objective-C pero si se comporta como debería, -1% 3 es 2 y, de hecho, el módulo funcionará correctamente incluso para números negativos.
Ricket
No, en C es (aparentemente demasiado flojo para verificar el estándar en esta hora impía) dependiente de la máquina. Acabo de verificar en mi computadora portátil que -5% 3 es igual a -2.
Kaj
¿Alguien puede publicar algún código, por favor? Todos estos números me marean. He estado desarrollando durante casi 3 meses, así que todavía no soy un experto. Me gustó la forma en que Kaj habló de 4 sprites, parece la forma más fácil. ¿Me puede mostrar una muestra de código para esto? Aprendo más rápido al mirar el código y jugar con él. He cambiado el tamaño de la imagen a 512x320px. ¿Puede alguien ayudarme por favor? David
David Holmes
2

Si te entiendo correctamente, puedes crear un conjunto de imágenes. Cada imagen tiene un punto de entrada y un punto de salida. Para facilitar las cosas, puede hacer que todos los puntos de entrada y salidas salgan de la misma ubicación. Luego, puede pasar aleatoriamente entre diferentes imágenes para que el jugador no encuentre un nivel completamente redundante. Si desea mezclar un poco las cosas, puede crear imágenes que tengan diferentes entradas y salidas. Solo tendrá que trabajar un poco más para asegurarse de que la salida de una imagen coincida con la entrada de la siguiente.

zooropa
fuente