所以我試圖使用SFML中的.setFont(sf::Font)
方法,它似乎以某種方式破壞了sf::Text
對象的其餘部分。我使用下面的函數來做到這一點:SFML 2.1「setFont」未處理的異常
sf::Text Renderer::CreateText(FontEntity font)
{
sf::Text out;
out.setFont(font.GetFont());
out.setString(font.GetText());
out.setCharacterSize(24);
out.setColor(sf::Color::White);
out.setStyle(sf::Text::Bold);
return out;
}
以上是平局呼叫我實現了使用,並且是我認爲問題可能存在(雖然我不知道在哪裏) :
void Renderer::Draw(DrawData* drawData)
{
this->window->clear();
for (Entity* entity: drawData->GetEntities())
{
auto fontEntity = static_cast<FontEntity*>(entity);
// If font entity
if (fontEntity)
{
sf::Text text = CreateText(*fontEntity);
this->window->draw(text);
}
}
this->window->display();
}
此遍歷Entity
對象的列表,並將其轉換爲FontEntity
目的,經過轉換FontEntity
成CreateText(FontEntity)
方法,然後試圖繪製返回的sf::Text
。
然而,當out.setString(font.GetText());
被調用時,我得到異常:
在0x6177BA8C(SFML圖形-d-2.DLL)在 GameEngine.exe未處理的異常:0000005:訪問衝突讀取位置 0x0000000D。
另一方面,如果我刪除out.setFont(font.GetFont())
行,則不會發生此錯誤。
我想知道是否有人知道這裏發生了什麼?我似乎無法在這個特定問題上找到任何建議,並且我試過(並且失敗)遵循SFML Text and fonts tutorial。
我的第一個想法是,我有一些可怕的指針問題正在進行,但據我瞭解教程,我試圖做的應該沒問題。
FontEntity
類是我用來管理什麼是有效可繪製字符串的自定義類,但可以很好地存儲在我的Entity
對象列表中。
.h文件,如果有幫助,如下:
#include "Entity.h"
#include <string>
#include "SFML\Graphics.hpp"
class FontEntity : public Entity
{
public:
FontEntity(float x, float y, sf::Font font);
FontEntity(float x, float y, sf::Font font, std::string text);
~FontEntity(void);
std::string GetText(void);
void SetText(std::string);
sf::Font GetFont(void);
void SetFont(sf::Font);
int GetSize(void);
void SetSize(int);
protected:
std::string text;
sf::Font font;
int size;
};
和.cpp文件:
#include "stdafx.h"
#include "FontEntity.h"
FontEntity::FontEntity(float x, float y, sf::Font font) : Entity(x, y)
{
this->text = "";
this->font = font;
}
FontEntity::FontEntity(float x, float y, sf::Font font, std::string text) : Entity(x, y)
{
this->text = text;
this->font = font;
}
FontEntity::~FontEntity(void)
{
}
std::string FontEntity::GetText(void)
{
return this->text;
}
void FontEntity::SetText(std::string text)
{
this->text = text;
}
sf::Font FontEntity::GetFont(void)
{
return this->font;
}
void FontEntity::SetFont(sf::Font font)
{
this->font = font;
}
int FontEntity::GetSize(void)
{
return this->size;
}
void FontEntity::SetSize(int size)
{
this->size = size;
}
感謝您的閱讀!所有的輸入是完全讚賞。
sf :: Text保存對其使用的sf :: Font的引用。由於這個原因,你不應該把它設置爲臨時的。看來你在這裏做(getFont()返回值,而不是引用)。因此,字體超出了範圍並死亡,但它仍然指向它。我不是積極的,這是問題,但我會檢查它。 – 2013-10-24 02:53:21