Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] "Access violation reading location"

Ostatnio zmodyfikowano 2016-03-29 15:39
Autor Wiadomość
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":
C/C++
#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":
C/C++
#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;
    //sf::Text GameTittle;
    //Button button;
};
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:
C/C++
#include "MainMenu.h"

void MainMenu::Draw( sf::RenderWindow & gameWindow )
{
    //this->button.Draw(gameWindow);
    //std::vector<Button>::iterator it;
    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 :)
P-146666
pekfos
» 2016-03-28 21:35:45
C/C++
this->buttonTittle.setFont( this->buttonFont );
Przenieś tą linię na początek Draw().
P-146667
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"?
P-146677
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?
P-146697
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?
P-146712
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.
P-146722
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.
P-146724
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. :-)
P-146733
« 1 »
  Strona 1 z 1