SFML blad przy rysowaniu textu

SFML blad przy rysowaniu textu
KO
  • Rejestracja:ponad 3 lata
  • Ostatnio:23 dni
  • Postów:12
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

Kopiuj
//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

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:minuta
  • Postów:6659
0

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


🕹️⌨️🖥️🖱️🎮
KO
gdy wykomentuje window.draw(temp.getText()); to wtedy dziala wszystko, a id to sa zwykle liczby, 1, 2, 3...
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
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

edytowany 2x, ostatnio: alagner
KO
nie mam linuxa... moge pokazac caly kod jezeli trzeba
Althorion
Pewnie będzie szybciej to po prostu WSL-em ogarnąć…
BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:3 dni
  • Postów:289
1

@Kostecko:

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

Zacznij od zamiany

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

na

Kopiuj
if (!font.loadFromFile("D:fonts/Pulang.ttf"))
{
    abort();
}
W2
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:47
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")

edytowany 2x, ostatnio: WWA2025
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
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):
Kopiuj
//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:

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

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.