Jetzt hab ich aber noch das Probelm, dass ich zwar das Level darstellen kann, aber ich kann es nicht verändern bzw. variabel halten (was ja eigentlich das Ziel ist
). HIer nochmal der allgemeine Ablauf, wenn das Programm startet:
1. RessourceManager, CollisionsSystem und GameStates initialisieren
1.1 Wenn der PlayState an der Reihe ist, wird der Konstruktor aufgerufen und eine Instanz von Tilemap erzeugt, welche sofort initialisiert wird. Der nächste Schritt im Konstruktor sieht so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
level[] = map.getLevelData(); //level[] = int level[];
//load the map
if (!map.load(game, MAP_FILE_PATH, sf::Vector2u(16, 16), level, 16, 8))
{
int result = MessageBox(NULL, "Failed to load the map in PlayState.cpp!", "ERROR", MB_OK | MB_ICONERROR);
if (result == IDOK)
game.App.close();
}
|
getLevelData sieht so aus:
|
C-/C++-Quelltext
|
1
2
3
4
|
int Tilemap::getLevelData()
{
return std::stoi(line);
}
|
Und load so:
|
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
|
bool Tilemap::load(Game &game, const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height)
{
//set a texture
m_tileset = game.R_Manager->getTexture(RessourceManager::Textures::SPRITESHEET_LEVEL1);
//m_level[] = getLevelData();
// resize the vertex array to fit the level size
m_vertices.setPrimitiveType(sf::Quads);
m_vertices.resize(width * height * 4);
// populate the vertex array, with one quad per tile
for (unsigned int i = 0; i < width; ++i)
for (unsigned int j = 0; j < height; ++j)
{
// get the current tile number
int tileNumber = tiles[i + j * width];
// find its position in the tileset texture
int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
// get a pointer to the current tile's quad
sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
// define its 4 corners
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);
// define its 4 texture coordinates
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;
}
|
EDIT:
Konstruktor von Tilemap:
|
C-/C++-Quelltext
|
1
2
3
4
|
Tilemap::Tilemap(const std::string &path)
{
read(path);
}
|
Und read:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
bool Tilemap::read(const std::string & path)
{
std::ifstream i_stream(path);
//return false if the file does not exist
if (!i_stream)
return false;
else
{
while (i_stream) //cancel at an error or end of file
{
std::getline(i_stream, line); //read the current line
}
return true;
}
}
|
Aber leider bekomme ich die Fehler:
Fehler C2059 Syntaxfehler: "]"
Fehler C2143 Syntaxfehler: Es fehlt ";" vor "{"
Fehler C2143 Syntaxfehler: Es fehlt ";" vor "}"
|
C-/C++-Quelltext
|
1
2
|
//PlayState::PlayState
level[] = map.getLevelData();
|
verursacht den Fehler. Aber wie kann ich ihn beheben?