• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Kurs SFML, pisanie mapy kafelkowej

Object Storage Arubacloud
0 głosów
426 wizyt
pytanie zadane 1 października 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 3 października 2017 przez Jakub 0

Witam, mam problem z dokładnym zrozumieniem jak działa metoda load w przykładzie mapy kafelkowej do tego artykułu z kursu sfml: https://www.sfml-dev.org/tutorials/2.4/graphics-vertex-array.php

Stwierdziłem że w kodzie dam informacje o tym co rozumiem a czego nie (jak czegoś nie rozumiem to dam !! przed komentarzem) :
 

class TileMap : public sf::Drawable, public sf::Transformable
{
public:
 
    bool load(const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height)
     //rozumiem że tileset to nazwa pliku z teksturaami ,tile size to wielkosc w pikselach tego obrazka, tiles to tablica terenu, widh i height to dlugosc i szerokosc mapy (tablicy) 
    {
        // wczytanie atlasu tekstur
        if (!m_tileset.loadFromFile(tileset))
            return false;
 
        // zmiana rozmiaru tablicy, tak aby pasowała do wielkości mapy
        m_vertices.setPrimitiveType(sf::Quads);
        m_vertices.resize(width * height * 4);
 
        // zapełnianie vertex array, po jednym na kafel  (zamiast tych wszystkich wyszukiwaqn dal bym tablice dwu wymiarową)
        for (unsigned int i = 0; i < width; ++i)
            for (unsigned int j = 0; j < height; ++j)
            {
                // !!pobranie obecnego numeru kafla ,CZEMU RAZY WIDTH?!
                int tileNumber = tiles[i + j * width];
 
                // znalezienie jego pozycji na tileset ,rozumiem ze tu chodzi o znalezenie w obrazku danej tekstury
                int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
                int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
 
                // pobranie wskaźnika do bieżącego kafla czworokąta (czy zamiast wskaznika nie mozna pracowac odrazu na vertexArray ?)
                sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
 
                // ustawienie 4 rogów (do ogarniecia)
                quad[0].position = sf::Vector2f(i * tileSize.x, j * tileSize.y);
                quad[1].position = sf::Vector2f((i + 1) * tileSize.x, j * tileSize.y);
                quad[2].position = sf::Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y);
                quad[3].position = sf::Vector2f(i * tileSize.x, (j + 1) * tileSize.y);
 
                // ustawienie 4 współrzędnych tekstury (to tez)
                quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y);
                quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);
                quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);
                quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);
            }
 
        return true;
    }
 
private:
 
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // ustawienie przekształceń
        states.transform *= getTransform();
 
        // ustawienie tekstury
        states.texture = &m_tileset;
 
        // narysowanie
        target.draw(m_vertices, states);
    }
 
    sf::VertexArray m_vertices; //tablica wierzcholkow
    sf::Texture m_tileset; //tekstura
};

Dziękuje za pomoc i pozdrawiam

komentarz zamknięcia: Juz znam odpowiedz
komentarz 1 października 2017 przez Jakub 0 Pasjonat (23,120 p.)
dodam że umiał bym napisać własny algorytm do rozwiązania tego problemu ale nie rozumiem tego (od kilku dni męczę się nad jego zrozumieniem)

1 odpowiedź

+1 głos
odpowiedź 2 października 2017 przez niezalogowany
wybrane 3 października 2017
 
Najlepsza
// !!pobranie obecnego numeru kafla ,CZEMU RAZY WIDTH?!
int tileNumber = tiles[i + j * width];

Proste przekształcenie z 2-wymiarowego indeksowania na 1-wymiarowe

komentarz 3 października 2017 przez Jakub 0 Pasjonat (23,120 p.)
Przepraszam że nie zamknąłem pytania ( juz to zrozumiałem wcześniej ) Ake dzięki za chęci

Podobne pytania

0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 8 listopada 2015 w C i C++ przez GameProgrammer Obywatel (1,140 p.)
0 głosów
0 odpowiedzi 138 wizyt
0 głosów
0 odpowiedzi 300 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez piotrek132 Obywatel (1,410 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...