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

Niko

Frischling

  • »Niko« ist der Autor dieses Themas
  • Private Nachricht senden

1

02.05.2006, 10:32

2d Framework

Hallo, ich versuche mich gerade mit dem 2d Framework.

Ich versuche gerade eine Tilemap aus einer CSV Datei zu lesen.

Hier mal meine CSV:

Quellcode

1
2
3
4
5
6
7
8
9
10
9,9,9,9,9,9,9,9,9,9
9,9,9,9,9,9,9,9,9,9
9,9,9,0,9,9,9,2,9,9
9,9,9,9,9,9,9,9,9,9
9,9,9,9,9,9,9,9,9,9
9,9,9,9,9,1,9,9,9,9
9,9,9,9,9,9,9,9,9,9
9,3,9,9,9,9,9,9,9,9
9,9,4,9,9,9,9,6,9,9
9,9,9,9,9,5,9,9,9,9


Und nun mein Versuch:

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
std::ifstream mapFile("data\\map.txt");

    // Tile-Map erzeugen

    p_tileMap = new TileMap(10, 10, 32, 32);
    for(int y = 0; y < 10; y++) 
    {
        std::string line;
        std::getline(mapFile,line);
        int index = 0;

        for(int x = 0; x < 10; x++)
        {
            if (line[index] == ',') index++;
            int tile = (int)line[index];
            //int tile = rand() % 40;


            ivec2 uv;
            switch(tile)
            {
            case 0: uv = ivec2(0, 192); break;      // Baum 1

            case 1: uv = ivec2(96, 192); break;     // Baum 2

            case 2: uv = ivec2(192, 192); break;    // Baum 3

            case 3: uv = ivec2(192, 480); break;    // Baum 4

            case 4: uv = ivec2(0, 416); break;      // Berg

            case 5: uv = ivec2(96, 416); break;     // Vulkan

            case 6: uv = ivec2(192, 576); break;    // Steine

            default: uv = ivec2(0, 32); break;      // Gras

            }

            p_tileMap->setTile(x, y, new StdTile(p_tiles, uv));
        }
    }

    mapFile.close();


Mein Problem ist nun, das die Tilemap nur aus Gras-Tiles entsteht. Also im Switchteil jedes Tile den default Wert nimmt.

Kann mir jemand sagen, wo mein Fehler ist?

Und meine zweite Frage: Wie speichere ich am besten meine Map, wenn ich z.B. 1000 x 1000 Tiles habe?
Muss ich mir dann einen Mapeditor schreiben und damit meine Map binär in eine Datei speichern, oder gibt es da noch eine andere Möglichkeit?

Ich habe vorher Browsergames programmier und meine Maps immer aus einer Grafik erstellt. Jeder Pixel der Grafik stand für ein Tile der Map.
Das fand ich immer sehr praktisch, da ich so keinen Mapeditor brauchte. Mein Editor war dann halt GIMP.
Sollte man sowas in C++ auch machen, oder ist das Speicherverschwendung?

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

2

02.05.2006, 10:56

So weit ich sehe, erhöst du index nur, wenn du ein ',' stehen hast, daher liest du immer nur das erste Zeichen.

mfg Philipp

Niko

Frischling

  • »Niko« ist der Autor dieses Themas
  • Private Nachricht senden

3

02.05.2006, 11:14

stimmt :crying:

aber wenn ich folgendes mache, geht es auch nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (line[index] == ',') index++;
            int tile = (int)line[index++];
            //int tile = rand() % 40;


            ivec2 uv;
            switch(tile)
            {
            case 0: uv = ivec2(0, 192); break;      // Baum 1

            case 1: uv = ivec2(96, 192); break;     // Baum 2

            case 2: uv = ivec2(192, 192); break;    // Baum 3

            case 3: uv = ivec2(192, 480); break;    // Baum 4

            case 4: uv = ivec2(0, 416); break;      // Berg

            case 5: uv = ivec2(96, 416); break;     // Vulkan

            case 6: uv = ivec2(192, 576); break;    // Steine

            default: uv = ivec2(0, 32); break;      // Gras

            }

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

4

02.05.2006, 11:41

Dann wirf mal den Debugger an, und schau welchen Wert line in jedem Schleifendurchlauf hat.

mfg Philipp

Niko

Frischling

  • »Niko« ist der Autor dieses Themas
  • Private Nachricht senden

5

02.05.2006, 12:21

juhuuu, ich habs selber gefunden :)

aus (char)9 wurde (int)57.
habe jetzt tile auf char umgestellt und im switch nach '0' statt 0 abgefragt.


nun bleibt nur noch meine zweite frage offen.

wie verwalte ich am geschicktesten eine 1000 x 1000 map?

matthias

Alter Hase

Beiträge: 449

Wohnort: wipperfürth

  • Private Nachricht senden

6

02.05.2006, 16:03

Zitat von »"Niko"«

juhuuu, ich habs selber gefunden :)

aus (char)9 wurde (int)57.
habe jetzt tile auf char umgestellt und im switch nach '0' statt 0 abgefragt.


nun bleibt nur noch meine zweite frage offen.

wie verwalte ich am geschicktesten eine 1000 x 1000 map?

am besten mit einem leveleditor, eine csv datei ist da ein wenig unübersichtlich :D
eine einfache mapdatei könnte dann so aussehen:
du speicherst 2 Intergerwerte (keine chars) für die breite und höhe und dann breite*höhe integers für die felder.
"In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Aplha Centauri."

Anonymous

unregistriert

7

02.05.2006, 17:43

CSV parsen lernen - Aber richtig!
http://trash.germangamedev.de/true_or_false_v1.001.018.13nt.ace

Dazu parst Du eine Textdatei die durch , getrennt ist und nicht durch ein ;. Daher: Das ist keine CSV.

Werbeanzeige