Hallo liebe Community,
ich arbeite im Moment an einem kleinem 2D Spiel (es ist eher noch ein Test anstelle eines wirklichen Spieles) und ich habe ein Grid basierten Hintergrund der
Nun habe ich einen Charakter der sich in der Mitte des Bildschirmes befindet, ich kann ihn mit den NumPad Tasten bewegen. Wenn ich diesen Charakter nach rechts bewege, so wird der Hintergrund nach links verschoben. Wenn ich ihn nach oben bewege, so wird der Hintergund nach unten verschoben. Und das selbe für die beiden anderen Richtungen.
Soweit so gut! Nun bin ich aber etwas überfragt wie ich es bezwecken kann das der Hintergrund aufhört sich zu verschieben wenn das Ende des Hintergrundes Sichtbar ist.
Hier ein visuelles Beispiel
Die Rote stelle in diesem Bild darf nicht Sichtbar sein. Der Spieler soll das Ende natürlich nicht sehen.
Der Hintergrund muss aufhören sich zu verschieben wenn dessen X und Y Position kleiner oder gleich 0 ist für die linke und obere Position. Das selbe für die rechte und untere Position.
Jede Zelle bekommt die "Initial Position" beim erstellen zugewiesen. Das geschiet beim laden des Grids.
Hier ist der Code der die Initial Position setzt
Spoiler anzeigen
Dies ist der Code um jede Zelle zu zeichnen
Spoiler anzeigen
e.DrawingLocations.ScreenPos.X und Y wird so ausgerechnet:
Meine endgültige Frage lautet: Wie würde der Code aussehen der das Hintergrund scrolling stoppt wenn der Hintergrund auf der rechten Seite kleiner oder gleich die momentane Breite des Bildschirms hat. Das selbe für die untere Position vom Hintergrund.
Danke für eure Hilfe!
ich arbeite im Moment an einem kleinem 2D Spiel (es ist eher noch ein Test anstelle eines wirklichen Spieles) und ich habe ein Grid basierten Hintergrund der
32x32
groß ist, und jede Zelle
in diesem 32x32
großen Grid ist 64x64
groß.Nun habe ich einen Charakter der sich in der Mitte des Bildschirmes befindet, ich kann ihn mit den NumPad Tasten bewegen. Wenn ich diesen Charakter nach rechts bewege, so wird der Hintergrund nach links verschoben. Wenn ich ihn nach oben bewege, so wird der Hintergund nach unten verschoben. Und das selbe für die beiden anderen Richtungen.
Soweit so gut! Nun bin ich aber etwas überfragt wie ich es bezwecken kann das der Hintergrund aufhört sich zu verschieben wenn das Ende des Hintergrundes Sichtbar ist.
Hier ein visuelles Beispiel
Die Rote stelle in diesem Bild darf nicht Sichtbar sein. Der Spieler soll das Ende natürlich nicht sehen.
Der Hintergrund muss aufhören sich zu verschieben wenn dessen X und Y Position kleiner oder gleich 0 ist für die linke und obere Position. Das selbe für die rechte und untere Position.
Jede Zelle bekommt die "Initial Position" beim erstellen zugewiesen. Das geschiet beim laden des Grids.
Hier ist der Code der die Initial Position setzt
C#-Quellcode
- for (int x = 0; x < grid.Width; x++) {
- for (int y = 0; y < grid.Height; y++) {
- CellProperties cellProperties = grid.GetCellObject(x, y);
- TextureProperties textureProperties = cellProperties.TextureProperties;
- int cellSize = grid.CellSize;
- if (textureProperties != null) {
- textureProperties.InitialPosition = new Vector2((x * cellSize) - cellSize, (y * cellSize) + cellSize - (Game.Resolution.Height / 2));
- }
- }
- }
Dies ist der Code um jede Zelle zu zeichnen
C#-Quellcode
- int cellSize = e.Grid.CellSize;
- float posX = cellProperties.TextureProperties.InitialPosition.X - pedPosX;
- float posY = cellProperties.TextureProperties.InitialPosition.Y - pedPosY;
- // Cell properties of top left, bottom left, top right and bottom right cell.
- CellProperties topLeftCell = e.Grid.GetCellObject(0, 0);
- CellProperties bottomLeftCell = e.Grid.GetCellObject(0, e.Grid.Height - 1);
- CellProperties topRightCell = e.Grid.GetCellObject(e.Grid.Width - 1, 0);
- CellProperties bottomRightCell = e.Grid.GetCellObject(e.Grid.Width - 1, e.Grid.Height - 1);
- // Top Left Tile
- double topLeftCellX = Math.Round(topLeftCell.TextureProperties.InitialPosition.X - pedPosX - (cellSize / 2), 0) * -1;
- double topLeftCellY = Math.Round(topLeftCell.TextureProperties.InitialPosition.Y - pedPosY - (cellSize / 2), 0) * -1;
- // Bottom Left Tile
- double bottomLeftCellX = Math.Round(bottomLeftCell.TextureProperties.InitialPosition.X - pedPosX - (cellSize / 2), 0) * -1;
- double bottomLeftCellY = Math.Round(bottomLeftCell.TextureProperties.InitialPosition.Y - pedPosY + (cellSize / 2), 0) * -1;
- // Top Right Tile
- double topRightCellX = Math.Round(topRightCell.TextureProperties.InitialPosition.X - pedPosX + (cellSize / 2), 0);
- double topRightCellY = Math.Round(topRightCell.TextureProperties.InitialPosition.Y - pedPosY - (cellSize / 2), 0) * -1;
- // Bottom Right Tile
- double bottomRightCellX = Math.Round(bottomRightCell.TextureProperties.InitialPosition.X - pedPosX + (cellSize / 2), 0);
- double bottomRightCellY = Math.Round(bottomRightCell.TextureProperties.InitialPosition.Y - pedPosY + (cellSize / 2), 0);
- // Boundaries
- // Funktioniert! Hintergrund scrolling wird gestoppt wenn X und Y Position der oberen linke Zelle kleiner oder gleich 0 ist.
- if (topLeftCellX <= 0) {
- //Game.DisplayText("Left is less or equal then 0"); // Debug
- posX = e.DrawingLocations.ScreenPos.X + (cellSize / 2);
- }
- if (topLeftCellY <= 0) {
- //Game.DisplayText("Top is less or equal then 0"); // Debug
- posY = e.DrawingLocations.ScreenPos.Y + (cellSize / 2);
- }
- // Nur noch die Begrenzung für die rechte und untere Bildschirmseite fehlt...
- if (topRightCellX <= Game.Resolution.Width) {
- //Game.DisplayText("Right is bigger or equal then 1920"); // Debug
- //posX = // ?
- }
- if (bottomRightCellY <= Game.Resolution.Height) {
- //Game.DisplayText("Bottom is bigger or equal then 1080"); // Debug
- //posY = // ?
- }
- // Get matrix and draw tile on screen
- Matrix matrix = GetMatrix(posX, posY, cellSize, cellSize);
- e.Graphics.DrawSprite(aTexture.Texture, matrix);
- // GetMatrix Funktion
- public Matrix GetMatrix(float CenterX, float CenterY, float Width, float Height)
- {
- Matrix matrix1 = Matrix.Translation(CenterX, CenterY, 0.0f);
- Matrix matrix2 = Matrix.Scaling(Width, Height, 1f);
- return Matrix.Identity * Matrix.Translation(-0.5f, -0.5f, 0.0f) * matrix2 * matrix1;
- }
e.DrawingLocations.ScreenPos.X und Y wird so ausgerechnet:
Meine endgültige Frage lautet: Wie würde der Code aussehen der das Hintergrund scrolling stoppt wenn der Hintergrund auf der rechten Seite kleiner oder gleich die momentane Breite des Bildschirms hat. Das selbe für die untere Position vom Hintergrund.
Danke für eure Hilfe!
Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button
Für VB.NET Entwickler: Option Strict On nicht vergessen!
Für VB.NET Entwickler: Option Strict On nicht vergessen!