• 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

VPS Starter Arubacloud
0 głosów
422 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ź 398 wizyt
pytanie zadane 8 listopada 2015 w C i C++ przez GameProgrammer Obywatel (1,140 p.)
0 głosów
0 odpowiedzi 134 wizyt
0 głosów
0 odpowiedzi 299 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez piotrek132 Obywatel (1,410 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...