SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Ошибка, когда использую Текст – "Vector erase iterator outside range"
В этой теме 5 ответов, 2 участника, последнее обновление Bellato 7 года/лет, 6 мес. назад.
-
АвторСообщения
-
Здравствуйте!
Использую SFML 2.2, MS Visual Studio Express 2013, пытаюсь создать меню…
Столкнулся с проблемой, когда начинаю использовать текст в отдельном классе, начинает вылетать ошибка: Vector erase iterator outside range
Если использовать текст в main.cpp, то все нормально…
Вот код
menu.h:
C++1234567891011121314151617181920212223#pragma once#include <SFML/Graphics.hpp>#define MAX_NUMBER_OF_ITEMS 2using namespace sf;class menu{public:menu(float width, float height);~menu();void draw(RenderWindow &window);void moveUp();void moveDown();private:int selectedItemIndex;Font font;Text startMenu[MAX_NUMBER_OF_ITEMS];};menu.cpp:
C++123456789101112131415161718192021222324252627282930313233#include <iostream>#include "menu.h"menu::menu(float width, float height){if (!font.loadFromFile("consolab.ttf")){std::cout << "cannot load font: consolab.ttf" << std::endl;}startMenu[0].setFont(font);startMenu[0].setColor(Color(Color::Red));startMenu[0].setString("Play");startMenu[0].setPosition(Vector2f(width / 2, (MAX_NUMBER_OF_ITEMS + 1) * 1));startMenu[1].setFont(font);startMenu[1].setColor(Color(Color::White));startMenu[1].setString("Exit");startMenu[1].setPosition(Vector2f(width / 2, (MAX_NUMBER_OF_ITEMS + 1) * 2));}menu::~menu(){}void menu::draw(RenderWindow &window){for (size_t i = 0; i < MAX_NUMBER_OF_ITEMS; i++){window.draw(startMenu[i]);}}main.cpp:
C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <SFML/Graphics.hpp>#include "tank.h"#include "menu.h"using namespace sf;int main(){RenderWindow window(VideoMode(800, 600), "Tanks v1.3");menu startingMenu(window.getSize().x, window.getSize().y);Tank player1;player1.addTankAttributes(650, 500, Color(255, 0, 0), "Player 1");Tank player2;player2.addTankAttributes(50, 500, Color(0, 0, 255), "Player 2");while (window.isOpen()){Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) //move up{player1.moveRight();}else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) //move down{player1.moveLeft();}window.clear(Color(21,196,202));startingMenu.draw(window);player1.drawTank(window);player2.drawTank(window);window.display();}return 0;}Есть еще один класс, tank.h, пробовал текст тут, та же проблема:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384#ifndef TANK_H#define TANK_H#include <SFML/Graphics.hpp>#include <iostream>using namespace sf;class Tank{public:void addTankAttributes(int x, int y, Color &color, String name);void drawTank(RenderWindow &window);void moveLeft();void moveRight();Tank();~Tank();private:const float rotation = 0.04;Texture tankTexture;Texture turretTexture;Sprite tankSprite;Sprite turretSprite;Font font;Text text;};Tank::Tank(){if (!tankTexture.loadFromFile("res/tank.png"))std::cout << "no tank.png file" << std::endl;tankSprite.setTexture(tankTexture);if (!turretTexture.loadFromFile("res/turret.png"))std::cout << "no turret.png file" << std::endl;turretSprite.setTexture(turretTexture);}void Tank::addTankAttributes(int x, int y, Color &color, String name){tankSprite.setColor(color);tankSprite.setPosition(x, y);turretSprite.setColor(color);turretSprite.setPosition(x+15, y+2);turretSprite.setOrigin(0, 0);}void Tank::drawTank(RenderWindow &window){window.draw(turretSprite);window.draw(tankSprite);}void Tank::moveLeft(){if (turretSprite.getRotation() > 152 || turretSprite.getRotation() < 17){turretSprite.rotate(-rotation);}}void Tank::moveRight(){if (turretSprite.getRotation() > 150 || turretSprite.getRotation() < 15){turretSprite.rotate(rotation);}}Tank::~Tank(){}#endif TANK_Hбольше файлов нет…
Заранее спасибо, всем кто отзовется, буду признателен за любую помощь.
Вот скрин ошибки:
Вложения:
You must be logged in to view attached files.Сам код не смотрел, но судя по ошибке итератор вектора выходит за пределы. Скорее всего в каком то месте итератор обращается к несуществующему элементу.
посмотрел код.
прям совсем если то же самое в main.cpp напишешь, то работает?
мне кажется вот тут валится
C++1234567void menu::draw(RenderWindow &window){for (size_t i = 0; i < MAX_NUMBER_OF_ITEMS; i++){window.draw(startMenu[i]);}}и попробуй вместо i здесь, поставить 0, например.
C++1window.draw(startMenu[i]);В общем, поигрался с кодом, в надежде, что, что то станет лучше… в итоге, ничего не вышло, вернулся к тому что было в предыдущем посту. Та ошибка пропала, теперь приложение просто крашится (картинка внизу)…
Я до этого, в tank.h пытался создать font и text, была та же проблема, там все было без условий, просто надо было вывести строчку “player 1″ и “player 2″, результат тот, что с предыдущего поста. Когда создал font и text в main.cpp, то он нормально заработал…
Если изменить код, как ты посоветовал, то ничего не происходит, загружается просто основной экран без меню…
Вложения:
You must be logged in to view attached files.Нет, попробовал опять, и если поставить 0 вместо i, то все равно выходит ошибка, которая на break.jpg
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.