• 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
158 wizyt
pytanie zadane 1 października 2017 w C i C++ przez Jakub 0 Dyskutant (9,350 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 Dyskutant (9,350 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 Dyskutant (9,350 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ź 147 wizyt
pytanie zadane 8 listopada 2015 w C i C++ przez GameProgrammer Obywatel (1,160 p.)
0 głosów
0 odpowiedzi 79 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez piotrek132 Obywatel (1,370 p.)
0 głosów
1 odpowiedź 84 wizyt
pytanie zadane 30 października 2016 w C i C++ przez mrdropex Początkujący (430 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

50,967 zapytań

93,252 odpowiedzi

189,275 komentarzy

24,849 pasjonatów

Przeglądających: 226
Pasjonatów: 18 Gości: 208

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.

...