Wie erstelle ich einen endlosen Bildlaufhintergrund?


8

Ich muss meinem Spiel einen scrollenden Hintergrund hinzufügen, das Bild ist 512x512px. Es ist für ein Autospiel mit Gegenverkehr und ich möchte in der Lage sein, auf die gegenüberliegende Seite zu wechseln und auch gegen den Verkehr zu fahren. Das Spiel ist im Hochformat und ich benutze cocos2d.

Wie kann ich das bestmöglich machen?


Wird der Hintergrund entlang x und y oder nur in eine Richtung gewickelt?
Ricket

Wie groß sind auch die Bildschirmabmessungen? Dh wird der Bildschirm immer kleiner als 512x512 sein?
Ricket

Antworten:


7

Ich würde im Grunde eine 2x2-Kachelkarte erstellen, in der die Kacheln zufällig 512x512 sind. Scrollen Sie wie gewohnt durch, aber sobald X über 512 hinausgeht, subtrahieren Sie 512 (oder machen Sie ein Modulo 512 - aber achten Sie auf negative Zahlen), dasselbe gilt für Y. Anstelle einer Poly zeichnen Sie also 4, obwohl nur 1 sichtbar ist Die meiste Zeit, aber in Grenzfällen sind alle 4 sichtbar (wenn Sie zum Beispiel 400 nach unten und 400 nach rechts gehen). Auf diese Weise sollte es für immer weiter scrollen.

Natürlich können Sie auch 4 Sprites anstelle einer Tilemap verwenden. Eine bei worldPos, eine bei worldPos + (512,0), eine bei worldPos + (0,512) und eine bei worldPos + (512.512).
Stellen Sie sicher, dass worldPos immer modulo 512 ist und dass es für immer scrollen sollte.

Bearbeitet, um Code hinzuzufügen:

Nicht getestet, Syntax nicht überprüft.
Sehr hartcodiert, um dieses Problem zu lösen. Es wäre besser mit einem tatsächlichen Array für eine Karte, aber für dieses spezielle Problem sollte dies funktionieren.
Nimmt an, dass 0,0 oben links auf dem Bildschirm angezeigt wird.

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

Im Fall von Modulo sind negative Zahlen kein Problem (zumindest für Objective-C; in Java sind sie es).
Ricket

"Ja wirklich?" Okay ... es ist maschinenabhängig, ich denke das iPhone ist gesegnet. Ich habe Objective-C seit anderthalb Jahren nicht mehr berührt.
Kaj

Um ehrlich zu sein, habe ich es auf Objective-C noch nicht ausprobiert. Ich mache eine fundierte Vermutung basierend auf der Tatsache, dass AFAIK Java das einzige ist, bei dem% nicht modulo ist, sondern "Rest". Jede andere Sprache, die ich gesehen habe, behandelt% wie Modulo. -1% 3 sollte 2 sein. Aber in Java ist es 1. Ich habe Objective-C nicht buchstäblich getestet, aber wenn es sich so verhält, wie es soll, dann ist -1% 3 2 und Modulo funktioniert auch bei negativen Zahlen korrekt.
Ricket

Nein, in C ist es (anscheinend zu faul, um den Standard zu dieser gottlosen Stunde zu überprüfen) maschinenabhängig. Ich habe gerade auf meinem Laptop überprüft, dass -5% 3 gleich -2 ist.
Kaj

Kann jemand bitte einen Code posten, all diese Zahlen machen mich nur schwindelig. Ich habe mich seit fast 3 Monaten entwickelt, bin also noch kein Experte. Ich mochte die 4 Sprites, über die Kaj sprach, es klingt wie der einfachste Weg. Können Sie mir ein Codebeispiel dafür zeigen? Ich lerne schneller, wenn ich mir Code anschaue und damit herumspiele. Ich habe die Bildgröße auf 512x320px geändert. Kann mir bitte jemand helfen? David
David Holmes

2

Wenn ich Sie richtig verstehe, können Sie eine Reihe von Bildern erstellen. Jedes Bild hat einen Eintrittspunkt und einen Austrittspunkt. Zur Vereinfachung können Sie alle Ein- und Ausstiegspunkte an derselben Stelle festlegen. Dann können Sie zufällig zwischen verschiedenen Bildern wechseln, damit der Player nicht auf ein vollständig redundantes Level stößt. Wenn Sie die Dinge ein wenig durcheinander bringen möchten, können Sie Bilder mit unterschiedlichen Ein- und Ausgängen erstellen. Sie müssen nur ein wenig mehr arbeiten, um sicherzustellen, dass der Ausgang eines Bildes mit dem Eingang des nächsten Bildes übereinstimmt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.