• 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

Ultraszybki serwer VPS NVMe START
0 głosów
138 wizyt
pytanie zadane 1 października w C i C++ przez Jakub 0 Mądrala (5,600 p.)
zamknięte 3 października 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 przez Jakub 0 Mądrala (5,600 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 przez shead VIP (141,060 p.)
wybrane 3 października przez shead
 
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 przez Jakub 0 Mądrala (5,600 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ź 135 wizyt
pytanie zadane 8 listopada 2015 w C i C++ przez GameProgrammer Obywatel (1,160 p.)
0 głosów
0 odpowiedzi 59 wizyt
pytanie zadane 27 stycznia w C i C++ przez piotrek132 Obywatel (1,340 p.)
0 głosów
1 odpowiedź 75 wizyt
pytanie zadane 30 października 2016 w C i C++ przez mrdropex Początkujący (440 p.)

41,475 zapytań

80,496 odpowiedzi

159,287 komentarzy

19,795 pasjonatów

Przeglądających: 336
Pasjonatów: 26 Gości: 310

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...