Я строю игру с нуля, используя библиотеку SFML для C ++, и сейчас я работаю над пользовательской системой TileMap. Сама система довольно проста: она читает файл JSON, структурированный определенным образом, извлекает координаты и путь текстуры (поэтому, плитка), создает спрайт с этой текстурой и помещает его в данную позицию, используя координаты. Я также планирую сделать инструмент GUI в будущем, чтобы легко создать эти файлы JSON, но сейчас это не важно. Система, которую я собрал в основном, работает ... или, по крайней мере, она должна. Но вместо того, чтобы показывать спрайт, он просто отображает белый квадрат. В любом случае, вот код: < /p>
tilemap.cpp:
#include "header/tilemap.hpp"
#include
void splitCoord(const std::string& coord, float& posX, float& posY) {
size_t virgola = coord.find(',');
assert(virgola != std::string::npos && "Coordinata non valida, manca la virgola");
posX = std::stof(coord.substr(0, virgola));
posY = std::stof(coord.substr(virgola + 1));
}
TileMap::TileMap() : fileStream("assets/tilemap/tiles.json") {
assert(fileStream.is_open() && "Impossibile caricare i dati della tilemap");
datiJson = nlohmann::json::parse(fileStream);
tiles.clear();
for (const auto& tileJson : datiJson) {
assert(tileJson.contains("file") && "Impossibile trovare il campo 'file' nel json");
assert(tileJson.contains("coord") && "Impossibile trovare il campo 'coord' nel file json");
Tile tile;
tile.file = tileJson["file"].get();
tile.coord = tileJson["coord"].get();
splitCoord(tile.coord, tile.posX, tile.posY);
if (!tile.texture.loadFromFile(tile.file)) {
assert(false && "Impossibile caricare la texture del tile");
}
tile.sprite = std::make_unique();
tile.sprite->setTexture(tile.texture);
tile.sprite->setPosition({tile.posX, tile.posY });
tiles.push_back(std::move(tile));
}
}
< /code>
tilemap.hpp:
#pragma once
#include
#include
#include
#include
#include
#include
#include
struct Tile {
std::string file;
std::string coord;
sf::Texture texture;
std::unique_ptr sprite;
float posX = 0;
float posY = 0;
};
class TileMap {
private:
std::ifstream fileStream;
nlohmann::json datiJson;
public:
std::vector tiles;
TileMap();
};
< /code>
game.cpp (где я называю Tilemap): < /p>
#include
#include "header/assets.hpp"
#include "header/utils.hpp"
#include "header/tilemap.hpp"
void avviaGioco(sf::RenderWindow& finestra) {
finestra.setSize(sf::Vector2u(1280, 720));
Utils::centraFinestra(finestra, sf::VideoMode({1280, 720}));
TileMap tilemap;
while (finestra.isOpen()) {
while (const std::optional event = finestra.pollEvent()) {
if (event->is()) {
finestra.close();
}
}
finestra.clear();
for (const auto& tile : tilemap.tiles) {
if (tile.sprite)
finestra.draw(*tile.sprite);
}
finestra.display();
}
}
< /code>
tiles.json (пример): < /p>
[
{
"file": "assets/tilemap/tile_00.png",
"coord": "100,100"
}
]
Я проверил путь и провел некоторую отладку, но я не могу выяснить, что вызывает проблему, по крайней мере, с координат обработкой работает и ставит спрайты в нужно>
Я строю игру с нуля, используя библиотеку SFML для C ++, и сейчас я работаю над пользовательской системой TileMap. Сама система довольно проста: она читает файл JSON, структурированный определенным образом, извлекает координаты и путь текстуры (поэтому, плитка), создает спрайт с этой текстурой и помещает его в данную позицию, используя координаты. Я также планирую сделать инструмент GUI в будущем, чтобы легко создать эти файлы JSON, но сейчас это не важно. Система, которую я собрал в основном, работает ... или, по крайней мере, она должна. Но вместо того, чтобы показывать спрайт, он просто отображает белый квадрат. В любом случае, вот код: < /p> tilemap.cpp: [code]#include "header/tilemap.hpp" #include
TileMap::TileMap() : fileStream("assets/tilemap/tiles.json") { assert(fileStream.is_open() && "Impossibile caricare i dati della tilemap"); datiJson = nlohmann::json::parse(fileStream); tiles.clear();
for (const auto& tileJson : datiJson) { assert(tileJson.contains("file") && "Impossibile trovare il campo 'file' nel json"); assert(tileJson.contains("coord") && "Impossibile trovare il campo 'coord' nel file json");
splitCoord(tile.coord, tile.posX, tile.posY); if (!tile.texture.loadFromFile(tile.file)) { assert(false && "Impossibile caricare la texture del tile"); }
while (finestra.isOpen()) { while (const std::optional event = finestra.pollEvent()) { if (event->is()) { finestra.close(); } } finestra.clear(); for (const auto& tile : tilemap.tiles) { if (tile.sprite) finestra.draw(*tile.sprite); } finestra.display(); } } < /code> tiles.json (пример): < /p> [ { "file": "assets/tilemap/tile_00.png", "coord": "100,100" } ] [/code] Я проверил путь и провел некоторую отладку, но я не могу выяснить, что вызывает проблему, по крайней мере, с координат обработкой работает и ставит спрайты в нужно>