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

1

01.05.2013, 15:54

FStream Map Ladefunktion(Groeße der Map bestimmen)

Hey Leute

Habe eben mal eine kleine Ladefunktion erstellt.

Soweit klappt diese auch ohne probleme, ich muss nur noch selbst angeben, wie groß die map ist, also mit hoehe und weite.


Hier mal der momentane Quellcode

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
#include <iostream>
#include <vector>
#include <fstream>
#include <stdio.h> 
#include <stdlib.h>
using namespace std;
vector<vector<int> > Karte;
vector<vector<int> > Collision;
int main()
{
    char FillMe[256];
    ifstream Input;
    Input.open("map.txt");
    if(!Input)
    {
        cout << "Fwehler datei konnte nicht geöffnet werden" << endl;

    }
    for(unsigned int j=0; j<2; j++)
    {
        vector<int> DerBufferKarte;
        vector<int> DerBufferCollison;

    for(unsigned int i=0; i<3;i++)
    {
    Input.getline(FillMe, 8, ',');
    DerBufferKarte.push_back(atoi(FillMe));
    Input.getline(FillMe, 8, '|');
    DerBufferCollison.push_back(atoi(FillMe));

    }
    Karte.push_back(DerBufferKarte);
    Collision.push_back(DerBufferCollison);

    }


    for(unsigned int j=0; j<2; j++)
    {
for(unsigned int i=0; i<3;i++)
{
    cout << Karte[j][i] ;
}
    }
cout <<"collsion" << endl;
    for(unsigned int j=0; j<2; j++)
    {
for(unsigned int i=0; i<3;i++)
{
    cout << Collision[j][i] ;
}
    }
    return 0;
}



So meine frage wäre nun, wie kann ich die Map hoehe und Breite in den for schleifen über die datei selbst rausfinden lassen, also wie oft diese schleifen durchlaufen werden?


Ich hoffe ihr könnt mir da helfen

MFG Leri

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

2

01.05.2013, 16:49

Ich würde den Teil zum Laden allgemein umändern.
Wenn Zeile != amEnde -> hol den Wert -> schreibe zum MapVector [Value][Layer]
Wenn Zeile == amEnde -> Layer++

Solange, bis die Datei am Ende ist.

Und beim Zeichnen dann einfach.

C-/C++-Quelltext

1
for(int i = 0; i < MapVector.size(); i++){  for(int j = 0; j < MapVector[i].size(); j++)    {       //Zeichne was   }}


So kannst du die Map beliebe auch in der Breite und Höhe verändern, ohne jegliche statische Größen festzulegen.

MfG
42 / Pi = 13,37

moritz31

Treue Seele

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

3

01.05.2013, 16:53

also ich hatte das damals bei mir sogemacht, dass meine map datei nen eigenen "header"(war ne tilemap), da stand dann zum beispiel drin, wie breit is die map, wie hoch, mit welchen feldern kann man kollidieren usw.

4

01.05.2013, 16:53

die Map ist ja in einer Datei, er soll ja so lange laden, bis die komplette datei fertig durchgelesen wurde.

Die Vectoren haben ja gegen anfang, den wert 0.

Verstehe deine Schleife nicht so ganz, wenn ich diese dort einbauen würde, käme ja beim laden der map aus der Datei nichts heraus, weil die momentane größe des Vektors ja gleich 0 wäre.

5

01.05.2013, 16:54

Die Map schaut so aus, also die Map datei

2,1|2,1|3,2|
2,1|2,1|3,2|

erste zahl ist das sprite des tiles die zweite die collision

moritz31

Treue Seele

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

6

01.05.2013, 16:59

also ich würde die Kollision nicht so einbauen, sondern einfach am Anfang eine Zeile machen, die ausgelesen und in einem vector oder was weiß ich gespeichert wird,
dann kann man mittels dieses vectors einfach immer die Kollision überpfrüfen :)
Meine Map Datei sah damals so aus

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
10 //wie breit?
10 // wie hoch?
2 3 4 Kollision
2222222222
2111111112
2111111112
2111131112
2111131112
2111122222
2111111112
2222222222
2222222222
2222222222

7

01.05.2013, 17:00

mir würde jetzt ne while schleife einfallen

bloss weiß ich nicht genau wie ich die zu benutzen hab.

wie sagt man denn in der bedingung, das er solang die zwei werte holen soll, bis er das ende der zeile erreicht hat also != aber was dann eof()?

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

8

01.05.2013, 17:02

Ich weiß ja nicht, wie das hier mit Codes posten gehandelt wird. Irgendwie sollen die Fragensteller ja auch was lernen.
Nja ich mein so. Wenn du eine neue Zeile anfängst, dann wird sie in einem string geschrieben.
Den String arbeitest du Stück für Stück ab und schreibst den Wert in den ersten Teil des Vectors, der Layer bleibt eben gleich.
Wenn die Zeile zuende ist, dann wird die Variable Layer inkrementiert und dann geht der Spaß von neuem los.
42 / Pi = 13,37

moritz31

Treue Seele

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

9

01.05.2013, 17:03

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
    //read header
 
    std::string header;
    std::ifstream Reader("Map/Level1.map");
    //read first line
    getline(Reader,header);
    // convert to int
    std::stringstream ss;
    ss << header;
    ss >> m_width;
    //read second line
    getline(Reader,header);
    //convert to int
    ss.clear();
    ss << header;
    ss >> m_height;
    //read third line
    getline(Reader,header);
    //convert to int
    ss.clear();
    ss << header;
    ss >> m_colwidth;
    //read fourfth line
    for(int i = 0;i < m_colwidth;i++)
    {
        m_tilecollision.push_back(Reader.get());
    }
    //read map
    for(int y = 0;y < m_width;y++)
    {
        for(int x = 0;x < m_height;x++)
        {
            m_tilemap.push_back(Reader.get());
        }
    }



bei mir sah das damals so aus :) hat wunderbar geklappt ;) kannst dir daran vielleicht selbstüberlegen wie du es am besten machst :) nehm lieber ne for als ne while schleife

10

01.05.2013, 17:08

das war auch zuerst meine idee, die größe der map direkt oben in der Datei zu platzieren, allerdings ist das bei mir eine schlechte lösung.

Ich möchte ja auch sagen, wenn die zeile zuende ist, gehe in die nächste.

nur ist halt das problem das sich teile der weite und breite später unterscheiden, und ich deshalb nicht sicher sein kann, das alle die breite 10 und hoehe 5 z.b haben.


Es muss also jede spalte egal ob 11,12,15 breite durchlaufen werden bis zum ende

Werbeanzeige