Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

11

23.02.2015, 04:13

Ich weiß nicht ob das so gemeint war, du sollst nur ein Vertex-Array nehmen um alle Objekte zu zeichnen, die Tiles können ja immer noch einzeln vorliegen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

23.02.2015, 06:35

Jein. Wenn er viele Tiles mit verschiedenen Texturen und nur einem einzigen VertexArray zeichnen will, bräuchte er einen Shader mit ArrayTextures. Ein Atlas ist da meist die einfachere Wahl.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Preakz

Frischling

  • »Preakz« ist der Autor dieses Themas

Beiträge: 30

Wohnort: NRW

  • Private Nachricht senden

13

24.02.2015, 02:11

Habe jetzt sozusagen einen Atlas der zu jeder ID die TexturPosition hält.
Mein Problem ist jetzt nur das einlesen der alten MapDaten.

Ich glaube wegen den Koordinaten wird das Bild nur ansatzweise richtig gerendert.
Hier mal mein Code mit Kommentaren:

Einmal das Laden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
bool TileMap::load(const char* filename)
{
    m_filename = filename;

    //Tileset textur holen
    sf::Texture& tex = m_textures.get(Textures::TileSet);
    m_pTileset = &tex;


    m_vertices.setPrimitiveType(sf::PrimitiveType::Quads);

    // START PARSING!
    UINT numObj = getNumberOfObjects();
    //65520 sind die Anzahl der zu erstellenden TileObjecte (alle MapTiles)
    //ich gehe davon aus da ja jedes Tile 4 Punkte Braucht * 4...
    m_vertices.resize(numObj * 4);

    try
    {
        std::ifstream fin(filename);
        if (fin.is_open() == false)
        {
            // error
            std::cout << "FAIL!" << std::endl;
            throw std::runtime_error("Cant open world map file ! ");
        }
        else
        {
            std::string line = "";
            float numPos = 0;

            while (std::getline(fin,line))
            {
                vector<string> tileData;
                boost::split_regex(tileData,line,boost::regex("(,)+"));

                if (!tileData[0].empty())
                {

                    //Parse stuff (Parsen funkt alles!)
                    int id = boost::lexical_cast<int>(tileData[0].c_str());
                    float xpos = boost::lexical_cast<float>(tileData[1].c_str());
                    float ypos = boost::lexical_cast<float>(tileData[2].c_str());
                    int isBlocking = boost::lexical_cast<int>(tileData[3].c_str());
                    int Layer = boost::lexical_cast<int>(tileData[4].c_str());
                    
                    MRect a;
                    //MRect (Strut) hält IntRect und die Id
                    for (auto it = m_textureRects.begin(); it != m_textureRects.end(); ++it)
                    {
                        if (it->id == id)
                        {
                            a = *it;
                            //std::cout << "Found" << std::endl;
                            break;
                        }
                    }                   
                    
                

                    //ID TileSize holen
                    sf::Vector2f tsize = sf::Vector2f(a.rect.left, a.rect.top);


                    // NumPos = Aktuelle ObjectNummer ( z.B. 1 von unseren 65520 Objekten )
                    // Hole Vertex  ? Hier wird die Map fast richtig gezeichnet aber ich glaube das ist falsch :S
                    // Wie gesagt X & Y ist schon vorhanden also das sind die *32 berechneten Coordinaten sind...
                    sf::Vertex* quad = &m_vertices[numPos * 4];
                    // Welt Position des Tiles setzen ( die 4 Punkte )
                    quad[0].position = sf::Vector2f(xpos,ypos);
                    quad[1].position = sf::Vector2f(xpos + tsize.x,ypos);
                    quad[2].position = sf::Vector2f(xpos + tsize.x,ypos + tsize.y);
                    quad[3].position = sf::Vector2f(xpos,ypos + tsize.y);

                    // Koordinaten für das das Tile im Tileset definieren
                    quad[0].texCoords = sf::Vector2f(a.rect.left,a.rect.top);
                    quad[1].texCoords = sf::Vector2f(a.rect.left + a.rect.width, a.rect.top);
                    quad[2].texCoords = sf::Vector2f(a.rect.left + a.rect.width, a.rect.top + a.rect.height);
                    quad[3].texCoords = sf::Vector2f(a.rect.left, a.rect.top + a.rect.height);
                }
                //Zähler position erhöhen (Zeile x) | 1 Objekt pro Zeile
                numPos++;               
            }
            fin.close();
            std::cout << "Done!" << std::endl;

        }
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << endl;
    }

    return true;
}


und das zeichnen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void TileMap::draw(sf::RenderTarget& target,sf::RenderStates states) const
{
    //Transform
    states.transform *= getTransform();

    //Tileset setzen
    states.texture = m_pTileset;

    //Alle vertices zeichen
    target.draw(m_vertices, states);
}


Weiß nicht wo ich da einen Fehler mache :S
Hier mal ein Ausschnitt von einer World: (Aufbau: TexturID, X, Y ... ) X und Y sind die schon berechneten Positionen ( x*32, y*32)

Quellcode

1
2
3
4
5
6
7
8
9
148,1152,5440,0,0
497,1152,5472,0,1
476,1152,5504,0,0
497,1152,5536,0,0
476,1152,5568,0,0
497,1152,5600,0,0
476,1152,5632,0,0
497,1152,5664,0,0
476,1152,5696,0,0


PS: weiß nicht genau ob es daran liegen könnte wie das MapFile abgespeichert ist und wie ich es in den Vertex einlese
meine das Mapfile wurde so abgespeichert. (MapFile ist von einem alten Projekt ...)

Quellcode

1
2
3
for ( y  ... < height )
     for ( x ....< width )
         save position to file


Wenn mir da jemand weiterhelfen könnte wäre ziemlich cool stehe da jetzt schon seit X Stunden auf dem Schlauch :(

LG
Preakz

14

24.02.2015, 13:26

Ist es notwendig, dass du jedes einzelne Tile wirklich als eigenes Quad rendern musst?
Reicht es für deine Zwecke nicht zu, eine Textur bspw. pro Chunk auf der CPU mit allen Tiles in dem Chunk zu preparieren und dann 1 Quad für den Chunk zu rendern? Wenn sich die Tiles nicht grad >=1 mal im Frame ändern, sollte das in Ordnung sein. Auf diese Weise kannst du dann auch leicht die Chunks aus der Render Pipe raushauen, die nicht im Blickfeld sind. Ebenfalls sind LODs deiner Texturen dann leicht zu implementieren.

Pro Chunk hast du dann einen Draw Call. Ich meine, dass das in deiner Anwendung vertretbar ist.
Die Vertices brauchst du außerdem dann nur einmal binden (Dadurch gibt es evtl. auch nochmal einen performance schub). Die Texturkoordinaten bleiben gleich. Nur entsprechende Textur musst du uploaden.

Dein Foto in [HILFE/SFML] TileMapEditor Container Performance? wird leider nicht angezeigt.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (24.02.2015, 13:32)


Preakz

Frischling

  • »Preakz« ist der Autor dieses Themas

Beiträge: 30

Wohnort: NRW

  • Private Nachricht senden

15

24.02.2015, 15:19

Ja ich werde jetzt alles mal überarbeiten ^^

Werbeanzeige