Warsztat.GDCompo!ProjektyMediaArtykułyQ&AForumOferty pracyPobieranie

Opisz napotkaną sytuację, a redakcja niezwłocznie znajdzie rozwiązanie!

wyślij anuluj

Mapa kafelkowa

Tekst został importowany z Warsztatowej wiki. Jeżeli został importowany poprawnie, usuń ten szablon!

Opis

Mapa kafelkowa (a właściwie: mapa kafelkowa) jest jednym z zagadnień opracowywanych w ramach Programowania na przykładach. Przedstawione poniżej fragmenty kodu mają na celu pokazanie jak wyświetlić na ekranie mapę złożoną z kafli (potencjalnie scrollowaną).

__TOC__

ShadowDancer

* Język: C# / XNA

* Środowisko użyte: Microsoft Visual Studio 2008 / Xna Game Studio 3.0

* http://rapidshare.com/files/435635258/MapaKafelkowa.7z

Dowiesz się o

* Prostym wczytywaniu mapy z pliku

* Poruszaniu mapy za pomocą WSAD/kursorów

* Wyświetlaniu mapy

Komentarz

Starałem się wszystko przedstawić jak najprościej, bez zbędnego pakowania w klasy itp.

Nasz program możemy podzielić na 3 etapy:

Wczytywanie mapy

//wczytaj poziom z pliku

int Szerokość = 0;

//bufor na dane

List Data = new List();

using (StreamReader Reader = new StreamReader("Content/tiles.txt"))

{

//pobieramy pierwszą linię string CurrentLine = Reader.ReadLine(); //wczytujemy szerokość jednej linij Szerokość = CurrentLine.Length; do { //dodajemy dane do bufora... Data.Add(CurrentLine); } //jeśli mamy co czytać while ((CurrentLine = Reader.ReadLine()) != null);

}

//alokujemy tablice na nasze dane

Tiles = new int[Szerokość, Data.Count];

//przenosimy dane z bufora do tablicy

for(int y = 0; y < Data.Count; y++)

{

for (int x = 0; x < Data[y].Length; x++) { //w swojej grze tu będziesz konwertował znaki na obiekty swojej klasy Tile, ja użyłem intów switch(Data[y][x])//najpierw y, ponieważ w liście kafelki ułożone są wierszami { //puse miejsce, zapisujemy jako 0 case '.': Tiles[x, y] = 0; break; //platforma - 1 case '#': Tiles[x, y] = 1; break; } }

}

Zasadniczo składa się ono z dwóch części - pobierania danych z pliku tekstowego, przetworzenie ich i umieszczenie we wcześniej przygotowanej tablicy.

Rysowanie

//pozycja pierwszego kafelka - pozycja kamery / wielkość kafla

Vector2 FirstTile = new Vector2((int)(CameraPosition.X / TileSizeX), (int)(CameraPosition.Y / TileSizeY));

//ilość kafli do narysowania - powała z wielkośći kamery / wielkość kafla. Powała, ponieważ prawie zawsze wielkość kamery nie dzieli się całkowicie przez wielkośc kafla i dlaego musimy wyświetlić jeszcze kawałek nastepnego

Vector2 TilesToDraw = new Vector2((int)Math.Ceiling((double)(CameraSize.X / TileSizeX)), (int)Math.Ceiling((double)CameraSize.Y / TileSizeY));

//reszta z dzielenia pozycji kamery przez wielkośc kafla - użyjemy jej do płynnego przesuwania mapy

Vector2 Move = new Vector2(CameraPosition.X % TileSizeX, CameraPosition.Y % TileSizeY);

//dodajemy jeden doatkowy kafel do wyświetlenia, aby przewijanie było płynne(bo pierwszy kafel schowa się za lewą krawędzią ekranu)

TilesToDraw.X++;

TilesToDraw.Y++;

//sprawdzamy, czy nie rysujemy więcej kafli niż mamy

if (FirstTile.X + TilesToDraw.X > TilesLengthX) TilesToDraw.X = TilesLengthX - FirstTile.X;

if (FirstTile.Y + TilesToDraw.Y > TilesLengthY) TilesToDraw.Y = TilesLengthY - FirstTile.Y;

//rysujemy kafle na ekranie

for (int y = 0; y < (int)TilesToDraw.Y; ++y)

{

for (int x = 0; x < (int)TilesToDraw.X; ++x) { //sprawdzamy, czy w danym miejscu ma być kafel if (Tiles[x + (int)FirstTile.X, y + (int)FirstTile.Y] == 1) { //wyliczamy pozycję - indeks w tablicy * rozmiar kafelka Vector2 position = new Vector2(x, y) * new Vector2(TileSizeX, TileSizeY); //przesywamy tilesy o resztę z dzielenia przesunięcia kamery przez szerokosć kafla(aby przewijanie było płynne) position -= Move;//bez tego następny kafel nie byłby rysowany do momentu całkowitego wejścia na ekran //rysujemy spriteBatch.Draw(TileTexture, position, Color.White); } }

}

Ta część może wyglądać dosyć skomplikowanie, ale tak naprawdę jest prosta.

Najpierw obliczamy różne potrzebne rzeczy, takie jak przesunięcie kamery, ilość kafli mieszczących się w oknie itp.

Drugi etap, to w dwóch pętlach wypełniamy ekran kafelkami.

Autor implementacji 2

* Język: FooBar

* Środowisko użyte: Barer

* Plik z paczką

mainer.baz

I { love.you; }

lala.baz

I { love.you; }

Tekst dodał:
WarsztatBOT
08.12.2010 10:52

Ostatnia edycja:
WarsztatBOT
08.12.2010 10:52

Kategorie:

Aby edytować tekst, musisz się zalogować.

# Edytuj Porównaj Czas Autor Rozmiar
#1 edytuj 08.12.2010 10:52 WarsztatBOT 5.12 KB
Zwykły
Do sprawdzenia
Do akceptacji
  • Napisz komentarz:
    Aby dodać swój komentarz, musisz się zalogować.
Licencja Creative Commons

Warsztat używa plików cookies. | Copyright © 2006-2017 Warsztat · Kontakt · Regulamin i polityka prywatności
build #ff080b4740 (Tue Mar 25 11:39:28 CET 2014)