Anonymous
SFML отладка не удалась: векторный индекс из диапазона C ++
Сообщение
Anonymous » 11 апр 2025, 17:01
Я делаю набор плитки для 2D игры, но когда я пытаюсь нарисовать карту, она дала мне векторный индекс из диапазона, если я использовал .push_back
Вот код для класса карты:
Код: Выделить всё
#include "GameMap.h"
void GameMap::setUpInitialState()
{
//Set up player initial state
exitPos = sf::Vector2i(1, 0);
//Playwe start at the bottom
playerPos = sf::Vector2i(gridLength - 1, gridLength - 1);
}
void GameMap::setUpEnemyPosition()
{
enemyPosition.clear(); //Clear current enemy position
enemyPosition.push_back(sf::Vector2i(0, 2)); //Enenmy 1
enemyPosition.push_back(sf::Vector2i(6, 0)); //Enenmy 2
enemyPosition.push_back(sf::Vector2i(2, 7)); //Enenmy 3
}
void GameMap::setUpTiles() //Setting up the map
{
tiles.clear();
std::vector firstRow;
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 0, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 50, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 100, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 150, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 200, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 250, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 300, 0, true, false));
firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 350, 0, true, false));
tiles.push_back(firstRow);
GameMap::GameMap()
{
gridLength = 8;
setUpInitialState();
}
GameMap::~GameMap()
{
}
< /code>
Это класс плитки: < /p>
#include "GameTiles.h"
GameTile::GameTile(std::string, float x, float y, bool goThrough, bool exit) : sprite(texture)
{
position = sf::Vector2f(x, y);
sprite.setPosition(position);
CanMoveThrough = goThrough;
isExit = exit;
}
GameTile::~GameTile()
{
}
bool GameTile::setUpSprite(std::string textureName)
{
if (!texture.loadFromFile(textureName))
{
return false;
}
texture.setSmooth(true);
sprite.setTexture(texture);
sprite.setTextureRect(sf::IntRect({ 0, 0 }, { 50, 50 }));
return true;
}
И ошибка возникает только тогда, когда я добираюсь до цикла в main.cpp
Код: Выделить всё
#include "GameTiles.cpp"
int main()
{
sf::RenderWindow* window = new sf::RenderWindow(sf::VideoMode({ 400, 400 }), "SFML works!");
GameMap WorldMap = GameMap(); //Constructor set up grid length
while (window->isOpen())
{
while (const std::optional event = window->pollEvent())
{
if (event->is())
window->close();
}
window->clear();
//Displaying the world
for (int i = WorldMap.gridLength; i >= 0; i--)
{
for (int j = WorldMap.gridLength; j >= WorldMap.gridLength; j--)
{
window->draw(WorldMap.tiles[j][i]->sprite);
}
}
window->display();
}
}
Я попытался изменить значения сетки, плитки и т. Д., но это все еще не сработает.
Подробнее здесь:
https://stackoverflow.com/questions/795 ... of-range-c
1744380086
Anonymous
Я делаю набор плитки для 2D игры, но когда я пытаюсь нарисовать карту, она дала мне векторный индекс из диапазона, если я использовал .push_back Вот код для класса карты: [code]#include "GameMap.h" void GameMap::setUpInitialState() { //Set up player initial state exitPos = sf::Vector2i(1, 0); //Playwe start at the bottom playerPos = sf::Vector2i(gridLength - 1, gridLength - 1); } void GameMap::setUpEnemyPosition() { enemyPosition.clear(); //Clear current enemy position enemyPosition.push_back(sf::Vector2i(0, 2)); //Enenmy 1 enemyPosition.push_back(sf::Vector2i(6, 0)); //Enenmy 2 enemyPosition.push_back(sf::Vector2i(2, 7)); //Enenmy 3 } void GameMap::setUpTiles() //Setting up the map { tiles.clear(); std::vector firstRow; firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 0, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 50, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 100, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 150, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 200, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 250, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 300, 0, true, false)); firstRow.push_back(new GameTile("Pixel Crawler - Free Pack/Environment/Tilesets/Floors_Tiles.png", 350, 0, true, false)); tiles.push_back(firstRow); GameMap::GameMap() { gridLength = 8; setUpInitialState(); } GameMap::~GameMap() { } < /code> Это класс плитки: < /p> #include "GameTiles.h" GameTile::GameTile(std::string, float x, float y, bool goThrough, bool exit) : sprite(texture) { position = sf::Vector2f(x, y); sprite.setPosition(position); CanMoveThrough = goThrough; isExit = exit; } GameTile::~GameTile() { } bool GameTile::setUpSprite(std::string textureName) { if (!texture.loadFromFile(textureName)) { return false; } texture.setSmooth(true); sprite.setTexture(texture); sprite.setTextureRect(sf::IntRect({ 0, 0 }, { 50, 50 })); return true; } [/code] И ошибка возникает только тогда, когда я добираюсь до цикла в main.cpp [code]#include "GameTiles.cpp" int main() { sf::RenderWindow* window = new sf::RenderWindow(sf::VideoMode({ 400, 400 }), "SFML works!"); GameMap WorldMap = GameMap(); //Constructor set up grid length while (window->isOpen()) { while (const std::optional event = window->pollEvent()) { if (event->is()) window->close(); } window->clear(); //Displaying the world for (int i = WorldMap.gridLength; i >= 0; i--) { for (int j = WorldMap.gridLength; j >= WorldMap.gridLength; j--) { window->draw(WorldMap.tiles[j][i]->sprite); } } window->display(); } } [/code] Я попытался изменить значения сетки, плитки и т. Д., но это все еще не сработает. Подробнее здесь: [url]https://stackoverflow.com/questions/79568449/sfml-debug-asertion-failed-vector-subscript-out-of-range-c[/url]