• 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

0 głosów
148 wizyt
pytanie zadane 1 października 2017 w C i C++ przez Jakub 0 Mądrala (6,970 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 Mądrala (6,970 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 Mądrala (6,970 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ź 139 wizyt
pytanie zadane 8 listopada 2015 w C i C++ przez GameProgrammer Obywatel (1,150 p.)
0 głosów
0 odpowiedzi 72 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez piotrek132 Obywatel (1,340 p.)
0 głosów
1 odpowiedź 80 wizyt
pytanie zadane 30 października 2016 w C i C++ przez mrdropex Początkujący (430 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.
Ciekawy innych porad? Odwiedź tę stronę!

45,720 zapytań

86,115 odpowiedzi

171,964 komentarzy

22,180 pasjonatów

Przeglądających: 323
Pasjonatów: 23 Gości: 300

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.

...