Come creare uno sfondo a scorrimento infinito?


8

Devo aggiungere uno sfondo scorrevole a un mio gioco, l'immagine è 512x512px. È per un gioco di auto con traffico a doppio senso e voglio essere in grado di attraversare il lato opposto e guidare anche contro il traffico. Il gioco è in modalità verticale e utilizzo cocos2d.

Come posso farlo nel miglior modo possibile?


Lo sfondo avvolgerà xey o solo in una direzione?
Ricket,

Inoltre quali sono le dimensioni dello schermo? Cioè lo schermo sarà sempre più piccolo di 512x512?
Ricket,

Risposte:


7

Fondamentalmente creerei una piastrella 2x2 in cui le tessere sono 512x512 e comunque. Scorri come faresti normalmente ma non appena X supera 512 sottrai 512 (o esegui un modulo 512 - ma fai attenzione ai numeri negativi), lo stesso per Y. Quindi, invece di un poli, disegni 4, anche se solo 1 sarà visibile la maggior parte delle volte, ma sui casi di confine sono visibili tutti e 4 (ad esempio, quando si scende 400 e 400 a destra). In questo modo dovrebbe scorrere per sempre.

Ovviamente puoi anche usare 4 sprite invece di una tilemap. Uno su worldPos, uno su worldPos + (512,0), uno su worldPos + (0,512) e uno su worldPos + (512.512).
Assicurati che worldPos sia sempre modulo 512 e di nuovo dovrebbe scorrere per sempre.

Modificato per aggiungere del codice: non

testato, non verificato dalla sintassi.
Molto hardcoded per risolvere questo problema. Sarebbe meglio con un array reale per una mappa, ma per questo problema specifico dovrebbe funzionare.
Presuppone che 0,0 sia in alto a sinistra sullo schermo.

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);
}

Nel caso di modulo, i numeri negativi non sono un problema (almeno per Objective-C; in Java, lo sono).
Ricket,

Veramente? Va bene ... dipende dalla macchina, immagino che l'iPhone sia benedetto. Non ho toccato Objective-C per un anno e mezzo.
Kaj,

Beh, in realtà, ad essere sincero, non l'ho mai provato su Objective-C. Sto facendo un'ipotesi basata sul fatto che AFAIK Java è l'unico in cui% non è modulo, è "resto". Qualsiasi altra lingua che ho visto gestisce% come modulo; -1% 3 dovrebbe essere 2. Ma in Java è 1. Non ho testato letteralmente Objective-C ma se si comporta come dovrebbe quindi -1% 3 è 2 e in effetti modulo funzionerà correttamente anche per numeri negativi.
Ricket,

No, in C è (apparentemente troppo pigro per controllare lo standard in questa ora empia) a seconda della macchina. Ho appena verificato sul mio laptop che -5% 3 è uguale a -2.
Kaj,

Qualcuno può pubblicare un po 'di codice per favore, tutti questi numeri mi fanno venire le vertigini. Sto sviluppando da quasi 3 mesi, quindi non sono ancora un esperto. Mi è piaciuto il modo in cui Kaj ha parlato di 4 sprite, sembra il modo più semplice. Puoi mostrarmi un esempio di codice per questo, imparo più velocemente guardando il codice e giocando con esso. Ho modificato le dimensioni dell'immagine in 512x320px. Qualcuno mi può aiutare per favore? David
David Holmes,

2

Se ti capisco correttamente, puoi creare una serie di immagini. Ogni immagine ha un punto di entrata e un punto di uscita. Per semplificare le cose, puoi creare tutti i punti di ingresso ed uscire dalla stessa posizione. Quindi, puoi passare casualmente tra immagini diverse in modo che il giocatore non raggiunga un livello completamente ridondante. Se vuoi mescolare un po 'le cose, potresti creare immagini con entrate e uscite diverse. Dovrai solo fare un po 'più di lavoro per assicurarti che l'uscita di un'immagine corrisponda all'ingresso dell'immagine successiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.