marc_xxx Temat założony przez niniejszego użytkownika |
[SFML] "Access violation reading location" » 2016-03-28 21:28:28 Cześć. Mam problem z moją gierką, którą napisałem. Otóż gierka kompiluje się normalnie, natomiast debbuger wyrzuca mi wyjątek "button.cpp": #include "Button.h"
Button::Button( std::string ButtonTittle ) { sf::FloatRect textBox; this->buttonFont.loadFromFile( "media/fonts/arial.ttf" ); this->buttonTittle.setFont( this->buttonFont ); this->buttonTittle.setString( ButtonTittle ); textBox = this->buttonTittle.getLocalBounds(); this->buttonTittle.setOrigin(( textBox.width / 2.0f ),( textBox.height / 2.0f ) ); this->buttonTittle.setPosition( 512.0f, 384.0f ); this->buttonShape.setSize( sf::Vector2f(( textBox.width + 4.0f ),( textBox.height + 15.0f ) ) ); this->buttonShape.setOrigin(( this->buttonShape.getSize() ) / 2.0f ); this->buttonShape.setPosition( this->buttonTittle.getPosition() ); this->buttonShape.setFillColor( sf::Color::Green ); }
Button::~Button() { }
void Button::Draw( sf::RenderWindow & gameWindow ) { gameWindow.draw( this->buttonShape ); gameWindow.draw( this->buttonTittle ); }
void Button::MouseOverAction() { } w linii gameWindow.draw( this->buttonTittle ); Wyjątek nie jest rzucany przez debugger gdy w pliku "MainMenu.h": #pragma once #include <vector> #include <string> #include "VVisibleObject.h" #include "Button.h"
class MainMenu : public VVisibleObject { public: MainMenu( std::string ButtonTittle ); ~MainMenu(); void ShowMenu(); static void AddButton( std::string ButtonTittle ); void operator +=( std::string ButtonTittle ); void Draw( sf::RenderWindow & gameWindow ) override; private: std::vector < Button > Buttons; }; zamiast wektora obiektów Button, tworzę pojedynczy obiekt, mało tego obiekt ten rysuje się poprawnie na ekranie, tak jak tego oczekiwałem. Może problem tkwi w wywoływaniu funkcji Draw dla klasy Button w pliku MainMenu.cpp: #include "MainMenu.h"
void MainMenu::Draw( sf::RenderWindow & gameWindow ) { for( int i = 0; i < this->Buttons.size(); i++ ) { Buttons[ i ].Draw( gameWindow ); } } (to nie cały plik mainmenu.cpp :P) Szukałem rozwiązania problemu w googlach i podpowiedziało mi żebym zobaczył czy nie mieszam dołączanych bibliotek dla trybu debug i release - dołączam wszystko poprawnie (pliki sfml-xxx-d.lib dla trybu debug) także nie wiem gdzie tkwi problem. Proszę o pomoc :) |
|
pekfos |
» 2016-03-28 21:35:45 this->buttonTittle.setFont( this->buttonFont );
|
Przenieś tą linię na początek Draw(). |
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2016-03-28 23:08:54 Teraz nie rzuca wyjątku ale nie wyświetla się napis (pewnie dlatego, że funkcja draw wywołuje się parę tysięcy razy an sekundę :D ). Możesz mi wytłumaczyć dlaczego teraz działa? Dlaczego przy deklarowaniu pojedynczego obiektu Button w klasie MainMenu działało "normalnie"? |
|
pekfos |
» 2016-03-29 09:49:55 Nie masz poprawnej implementacji kopiowania obiektów twojej klasy. Gdy vector ci obiekt skopiuje, dalej będziesz mieć ustawiony adres na starą czcionkę, a nie nową.
Poza tym, co to za głupi pomysł wczytywać 100 razy tę samą czcionkę, tylko dlatego, że chcesz mieć 100 przycisków? |
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2016-03-29 14:02:02 Sorry ale dalej nie rozumiem :/ W jakiejś funkcji w klasie MainMenu tworzę obiekt na stercie, w wektorze, Buttons.push_back( Button( ButtonTittle ) ); . W konstruktorze klasy button wczytuję czcionkę i ją ustawiam. Gdzie tutaj jest jakaś zmiana adresu albo zmiennej? Przecież czcionka zapisała się w obiekcie klasy Button, to gdzie jest problem? |
|
Gibas11 |
» 2016-03-29 14:52:09 http://www.sfml-dev.org/documentation/2.0/classsf_1_1Text.php#a2927805d1ae92d57f15034ea34756b81 Indeed, the text doesn't store its own copy of the font, but rather keeps a pointer to the one that you passed to this function.
|
Adres czcionki zmienia się co wywołanie push_back(...), zrób z niej składową statyczną (i upewnij, że wczytujesz tylko raz) – powinno działać i przy okazji oszczędzisz dysk. EDIT: Możesz też zamiast vectora użyć jakiejś listy, też powinno zadziałać i będziesz mógł zachować osobną czcionkę dla każdego obiektu Button. |
|
michal11 |
» 2016-03-29 15:19:09 Możesz tez zrobić jakiś manager zasobów, w którym będziesz wczytywał czcionki, tekstury itp. a z niego pobierał referencje na te wczytane zasoby. |
|
Gibas11 |
» 2016-03-29 15:39:55 @up Najlepsze rozwiązanie, trudne do realizacji, więc często lepiej pobrać gotowca, ale i tak +1. :-) |
|
« 1 » |