call stack:
> sfml-graphics-d-2.dll!std::_Tree<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Lbound(const unsigned int & _Keyval) Line 2109 C++
sfml-graphics-d-2.dll!std::_Tree<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::lower_bound(const unsigned int & _Keyval) Line 1575 C++
sfml-graphics-d-2.dll!std::map<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> > >::operator[](const unsigned int & _Keyval) Line 226 C++
sfml-graphics-d-2.dll!sf::Font::getGlyph(unsigned int codePoint, unsigned int characterSize, bool bold) Line 295 C++
sfml-graphics-d-2.dll!sf::Text::ensureGeometryUpdate() Line 269 C++
sfml-graphics-d-2.dll!sf::Text::getLocalBounds() Line 214 C++
Engine.exe!Text::getLocalBounds() Line 41 C++
Engine.exe!Button::setTextSize(unsigned int textSize) Line 56 C++
Engine.exe!Button::setString(std::basic_string<char,std::char_traits<char>,std::allocator<char> > text) Line 47 C++
Engine.exe!Button::Button(std::basic_string<char,std::char_traits<char>,std::allocator<char> > text, unsigned int textSize, sf::Vector2<float> pos, sf::Color textColor, sf::Color buttonFaceColor) Line 7 C++
Engine.exe!Missile_Command::initButtons() Line 56 C++
Engine.exe!Missile_Command::init() Line 29 C++
Engine.exe!Missile_Command::Missile_Command() Line 6 C++
Engine.exe!main() Line 4 C++
[External Code]
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
code:
void Text::draw(sf::RenderTarget & target, sf::RenderStates states) const{
target.draw(text);
}
which was called by:
void Button::draw(sf::RenderTarget & target, sf::RenderStates states) const{
target.draw(buttonFace);
target.draw(text);
}
No pointers were used to my knowledge.
The exact error is as follows:
Unhandled exception at 0x0F21F95C (sfml-graphics-d-2.dll) in Engine.exe: 0xC0000005: Access violation reading location 0x0000000D.
I've been trying to solve this for quite some time now. I think it has something to do with my sf::Text object not being properly initialized or something, but I couldn't find anything.
Here's the my Text class if anyone's interested:
#include "init.h"
Text::Text(sf::Vector2f pos, size_t size, sf::Color color, std::string text, std::string font){
setPosition(pos);
setSize(size);
setColor(color);
setText(text);
setFont(font);
}
Text::Text(std::string font, std::string text){
setText(text);
setFont(font);
}
std::string Text::getString() const{
return text.getString();
}
sf::Text Text::getText() const{
return text;
}
sf::Color Text::getColor() const{
return text.getColor();
}
int Text::getSize() const{
return text.getCharacterSize();
}
sf::Vector2f Text::getPosition() const{
return text.getPosition();
}
sf::Font Text::getFont() const{
return font;
}
sf::FloatRect Text::getLocalBounds() const{
return text.getLocalBounds();
}
void Text::setText(std::string text){
if (text != "" && text != " ")
this->text.setString(text);
}
void Text::setColor(sf::Color color){
text.setColor(color);
}
void Text::setSize(size_t size){
text.setCharacterSize(size);
}
void Text::setPosition(sf::Vector2f pos){
text.setPosition(pos);
}
void Text::setFont(std::string file){
if (!font.loadFromFile(file)){
std::exit(-1);
}
text.setFont(font);
}
void Text::draw(sf::RenderTarget & target, sf::RenderStates states) const{
target.draw(text);
}
"text" and "font" are private class members.
I am using Visual Studio 2013 Ultimate. I compiled SFML with cmake and I have been using that version for a few months now.
I changed my code now so that I don't use my Text class anymore but I am still getting the same error.
Button.cpp seems to be causing it now with it's derived draw method:
#include "init.h"
ui::Button::Button(std::string text, size_t textSize, sf::Vector2f pos, sf::Color textColor, sf::Color buttonFaceColor, std::string font){
this->font.loadFromFile(font);
this->text.setFont(this->font);
setString(text);
setPosition(pos);
setTextColor(textColor);
setButtonFaceColor(buttonFaceColor);
}
std::string ui::Button::getString() const{
return text.getString();
}
EntityR ui::Button::getButtonFaceObj() const{
return buttonFace;
}
sf::Vector2f ui::Button::getPosition() const{
return buttonFace.getPosition();
}
sf::Vector2f ui::Button::getButtonFaceSize() const{
return buttonFace.getSize();
}
size_t ui::Button::getTextSize() const{
return text.getCharacterSize();
}
sf::Color ui::Button::getTextColor() const{
return text.getColor();
}
sf::Color ui::Button::getButtonFaceColor() const{
return buttonFace.getColor();
}
void ui::Button::setString(std::string text){
this->text.setString(text);
setTextSize(getTextSize());
}
void ui::Button::setPosition(sf::Vector2f pos){
buttonFace.setPosition(pos);
text.setPosition(pos + sf::Vector2f(10, 10));
}
void ui::Button::setTextSize(size_t textSize){
text.setCharacterSize(textSize);
float width = 100;//text.getLocalBounds().width;
float height = 50;//text.getLocalBounds().height;
buttonFace.setSize(width + 20, height + 20);
}
void ui::Button::setTextColor(sf::Color color){
text.setColor(color);
}
void ui::Button::setButtonFaceColor(sf::Color color){
buttonFace.setColor(color);
}
bool ui::Button::isPressed(sf::Event event){
if (event.type == sf::Event::MouseButtonPressed){
if (event.mouseButton.button == sf::Mouse::Button::Left){
sf::Vector2f mouseLoc(event.mouseButton.x, event.mouseButton.y);
if (cd::doesIntersect(mouseLoc, buttonFace))
return true;
}
}
return false;
}
bool ui::Button::isHovering(sf::Mouse mouse){
if (cd::doesIntersect((sf::Vector2f)mouse.getPosition(), buttonFace))
return true;
return false;
}
void ui::Button::draw(sf::RenderTarget & target, sf::RenderStates states) const{
target.draw(buttonFace);
target.draw(text);
}
Here's Button.h as well:
#pragma once
namespace ui{
class Button : public sf::Drawable
{
EntityR buttonFace;
sf::Font font;
sf::Text text;
public:
Button(std::string text, size_t textSize, sf::Vector2f pos, sf::Color textColor, sf::Color buttonFaceColor, std::string font);
Button(){}
std::string getString() const;
EntityR getButtonFaceObj() const;
sf::Vector2f getPosition() const;
sf::Vector2f getButtonFaceSize() const;
size_t getTextSize() const;
sf::Color getTextColor() const;
sf::Color getButtonFaceColor() const;
void setString(std::string text);
void setPosition(sf::Vector2f pos);
void setTextSize(size_t textSize);
void setTextColor(sf::Color color);
void setButtonFaceColor(sf::Color color);
bool isPressed(sf::Event event);
bool isHovering(sf::Mouse mouse);
virtual void draw(sf::RenderTarget & target, sf::RenderStates states) const;
};
}
And here is where it is called from (Missile_Command.cpp):
void Missile_Command::init(){
//...
_quit = ui::Button("Quit", 32, sf::Vector2f(200, 200), sf::Color::Black, sf::Color(255, 255, 255, 128), "fonts/segoeuil.ttf");
_start = ui::Button("Start", 32, sf::Vector2f(200, 300), sf::Color::Black, sf::Color(255, 255, 255, 128), "fonts/segoeuil.ttf");
}
void Missile_Command::run(){
while (_window.isOpen()){
//...
_window.draw(_quit);
_window.draw(_start);
//...
}
}
I'm fairly new to SFML, so the problem most likely lies with my code.
Minimal working example:
#include <SFML/Graphics.hpp>
class Text : public sf::Drawable
{
sf::Font font;
sf::Text text;
public:
Text(std::string string){
if (!font.loadFromFile("segoeuil.ttf")) // Nothing wrong with loading the font
std::exit(-1);
text = sf::Text(string, font, 30);
}
Text(){ }
virtual void draw(sf::RenderTarget & target, sf::RenderStates states) const{
target.draw(text);
}
};
int main(){
sf::RenderWindow window(sf::VideoMode(800, 600), "Text test");
Text text("Text");
//Text text; -> same result
// Error (on draw) -> Access Violation
// Commenting this line out, solves the problem
text = Text("Text");
while (window.isOpen()){
window.clear();
window.draw(text);
window.display();
}
return 0;
}