Comment créer un fond de défilement sans fin?

8

J'ai besoin d'ajouter un fond de défilement à mon jeu, l'image est 512x512px. C'est pour un jeu de voiture avec un trafic bidirectionnel et je veux pouvoir traverser du côté opposé et conduire contre le trafic aussi. Le jeu est en mode portrait et j'utilise cocos2d.

Comment puis-je faire cela de la meilleure façon possible?

David Holmes
la source
L'arrière-plan s'enroulera-t-il le long de x et y ou seulement dans une direction?
Ricket
Quelles sont également les dimensions de l'écran? C'est-à-dire que l'écran sera toujours plus petit que 512x512?
Ricket

Réponses:

7

Je créerais essentiellement un tilemap 2x2 où les tuiles se trouvent être 512x512 et tout de même. Faites-le défiler comme vous le feriez normalement, mais dès que X dépasse 512 soustrayez 512 (ou faites un modulo 512 - mais méfiez-vous des nombres négatifs), même chose pour Y. Donc, au lieu d'un poly, vous dessinez 4, bien que seulement 1 soit visible la plupart du temps, mais sur les cas frontaliers, les 4 sont visibles (quand vous descendez 400 vers le bas et 400 vers la droite par exemple). De cette façon, il devrait défiler pour toujours.

Bien sûr, vous pouvez également utiliser 4 sprites au lieu d'un tilemap. Un chez worldPos, un chez worldPos + (512,0), un chez worldPos + (0,512) et un chez worldPos + (512,512).
Assurez-vous que worldPos est toujours modulo 512 et encore une fois il devrait défiler pour toujours.

Modifié pour ajouter du code:

non testé, pas de syntaxe vérifiée.
Très codé en dur pour résoudre ce problème. Ce serait mieux avec un tableau réel pour une carte, mais pour ce problème spécifique, cela devrait fonctionner.
Suppose que 0,0 est le coin supérieur gauche de l'écran.

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
la source
Dans le cas de modulo, les nombres négatifs ne sont pas un problème (du moins pour Objective-C; en Java, ils le sont).
Ricket
Vraiment? D'accord ... cela dépend de la machine, je suppose que l'iPhone est béni. Je n'ai pas touché Objective-C depuis un an et demi.
Kaj
En fait, pour être honnête, je ne l'ai pas essayé sur Objective-C. Je fais une supposition éclairée basée sur le fait que Java AFAIK est le seul où% n'est pas modulo, c'est "reste". Toute autre langue que j'ai vue gère% comme modulo; -1% 3 devrait être 2. Mais en Java, c'est 1. Je n'ai pas littéralement testé Objective-C mais s'il se comporte comme il est supposé, alors -1% 3 est 2 et en effet modulo fonctionnera correctement même pour les nombres négatifs.
Ricket
Non, en C, c'est (apparemment, trop paresseux pour vérifier la norme à cette heure impie) dépendant de la machine. Je viens de vérifier sur mon ordinateur portable que -5% 3 est égal à -2.
Kaj
Quelqu'un peut-il poster du code s'il vous plaît, tous ces chiffres me donnent le vertige. Je développe depuis près de 3 mois donc je ne suis pas encore un expert. J'ai aimé les 4 sprites dont Kaj a parlé, cela ressemble à la manière la plus simple. Pouvez-vous me montrer un exemple de code pour cela, j'apprends plus rapidement en regardant le code et en jouant avec. J'ai changé la taille de l'image en 512x320px. Est-ce que quelqu'un peut m'aider s'il vous plaît? David
David Holmes
2

Si je vous comprends bien, vous pouvez créer un ensemble d'images. Chaque image a un point d'entrée et un point de sortie. Pour faciliter les choses, vous pouvez faire tous les points d'entrée et de sortie au même endroit. Ensuite, vous pouvez aller au hasard entre différentes images afin que le joueur ne rencontre pas un niveau complètement redondant. Si vous voulez mélanger un peu les choses, vous pouvez créer des images qui ont des entrées et des sorties différentes. Vous aurez juste à faire un peu plus de travail pour vous assurer que la sortie d'une image correspond à l'entrée de l'image suivante.

zooropa
la source