SFML blad przy rysowaniu textu

0

czesc, chcialem zrobic 16 pokoi ktore maja wlasne id i przy rysowaniu kazde z tych id zostaje narysowane, ale tutaj mi wyrzuca blad

Exception thrown at 0x79F949EF (sfml-graphics-d-2.dll) in program.exe: 0xC0000005: Access violation reading location

//klasa board

void Board::draw(RenderWindow& window){
	for (Room temp : board) {
		window.draw(temp);
		window.draw(temp.getText()); //tu wywala blad
	}
}


//klasa room

Text Room::getText() { //funkcja getText
	return text;
}

Room::Room(int x, int y){ //konstruktor
	setSize(Vector2f(100, 50));
	setPosition(x, y);

	font.loadFromFile("D:fonts/Pulang.ttf");
	text.setFont(font);
	text.setCharacterSize(30);
	text.setString(std::to_string(getId()));
	text.setPosition(x + 50, y + 25);
}

jak cos to moge caly kod pokazac

0

Ścieżka do pliku jakaś taka... font.loadFromFile("D:fonts/Pulang.ttf");
Poza tym może tekst ma jakieś znaki niedrukowalne?

2

Weź to na Linuxie z address sanitizerem zbuduj.
Generalnie z kodu który podałeś trudno coś wywnioskować, ale błąd wskazuje na jakieś „mazanie” po pamięci.
EDIT: na Windowsa też ponoć jest: https://docs.microsoft.com/pl-pl/cpp/sanitizers/asan?view=msvc-170

1

@Kostecko:

@Spine ma prawdopodobnie rację co do ścieżki.

Zacznij od zamiany

  font.loadFromFile("D:fonts/Pulang.ttf");

na

if (!font.loadFromFile("D:fonts/Pulang.ttf"))
{
    abort();
}
0

strzelam
void Board::draw(RenderWindow& window) <-- dopisz "sf::" i sprawdź
może zamiast funkcji skorzystaj z metod wirtualnych, coś w ten design
virtual void draw(sf::RenderWindow& window)

//edit czcionkę, bitmapy, pliki dźwiękowe trzymałbym w katalogu roboczym (w tym samy co plik main.cpp)
np. utwórz katalog/folder "resources", a w nim katalogi/foldery "font", "img", "sounds"
i odwołujesz się w projekcie np. tak
font.loadFromFile("resources/font/Pulang.ttf")

1

Biorąc pod uwagę jakie błędy popełniają początkujący, to błąd jest w złym użyci "range base for" plus nie respektowania zasady 3/5/0 przez elemety w board, przez co kopia obiektu usuwa coś co nie powinna.

Kostecko napisał(a):
//klasa board

void Board::draw(RenderWindow& window){
	for (Room temp : board) {
		window.draw(temp);
		window.draw(temp.getText()); //tu wywala blad
	}
}

Szybka poprawka powinna pomóc:

void Board::draw(RenderWindow& window){
  for (Room& temp : board) { // różnica jednego znaku!
    window.draw(temp);
    window.draw(temp.getText());
  }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1