无法在列表迭代器中获取sf :: Text属性

时间:2016-10-18 01:02:03

标签: c++ visual-studio sfml

我正在使用sfml在C ++中开展一个小游戏。当您按TAB按钮时,屏幕右侧会出现一个带有四个按钮的小菜单。我创建了一个class Button,在课程中我有一个sf::Text属性。这是我用来绘制菜单的代码。

void DrawRightSideMenu(RenderWindow &win)
{
    window.draw(rectInGameMenu);
    for (list<Button>::iterator currentButton = rightSideMenuButtons.begin(); currentButton != rightSideMenuButtons.end(); currentButton++)
    {
        win.draw(*currentButton);
        Text buttonTextToDraw = currentButton->GetButtonText(); //Crash here
        win.draw(buttonTextToDraw);
    }
}

在执行此代码之前,所有按钮都是在另一个函数中创建的。 rectInGameMenu只是一个矩形,它工作正常。 win.draw(*currentButton);效果很好,但按钮中没有文字可预期。所以当我使用GetButtonText()时程序崩溃了。这样我就可以在按钮中绘制文字了。我得到一个错误,说它无法读取记忆中的那个位置(Violation d'accèslorsde la lecture de l'emplacement 0x550030BD)。对不起法语,我用法语使用Visual Studio。我真的不知道我能做些什么来解决这个问题。我做了一些研究,但我找不到有同样问题的人......我已经有几天这个问题,我真的不知道我能做些什么来解决它。如果有更好的方法,请随时告诉我。

编辑:

以下是我创建按钮的代码:

Button aButton;
aButton = Button(10, "Ressources/Fonts/font.ttf");
aButton.SetButtonText("Button Text");
aButton.setSize(Vector2f(246, 60));
aButton.setFillColor(Color(22, 235, 65));
aButton.setPosition(773, 120);
aButton.GetButtonText().setPosition(240, 30);
rightSideMenuButtons.push_back(aButton);

这是在创建游戏窗口时调用的void函数。现在,这是我在class Button中使用的方法:

Button::Button(int inFontSize, string inFontButton)
{
    fontSize = inFontSize;
    fontButton.loadFromFile(inFontButton);
}

void Button::SetButtonText(string inButtonText)
{
    buttonText.setString(inButtonText);
    buttonText.setFont(fontButton);
    buttonText.setCharacterSize(fontSize);
    buttonText.setColor(Color(255, 255, 255));
}

这些是函数使用的方法。 buttonTextText属性。 fontButtonFont属性。希望这对你们有所帮助。

1 个答案:

答案 0 :(得分:0)

检查这些:

  • 确保正确记录文字字体
  • 为文字添加颜色
  • 在渲染之前给它一个字符串

这是我的引擎中添加文本的功能:

void Actor::addRenderedElement(sf::Text * txt, const char * font_name, const char* text, sf::Color color)
{
    if (checkGameData()) {
        sf::Font* _font = gamedata->getFont(font_name);
        if (_font != nullptr) {
            txt->setFont(*_font);
            txt->setString(text);
            txt->setColor(color);
            renderedShapes.push_back(txt);
        }
        else
            std::cout << "Invalid font name " << font_name << " for " << name << std::endl;
    }
}

Et installe l'anglais sur visual;)

编辑: 从您编辑的代码:
由于Button似乎也是一个形状,你确定你给它一个纹理吗? 你是如何确保你的字体正确加载,我没有看到任何错误处理
我可以看到GetButtonText()功能吗? 为什么不重载按钮中的draw()功能来绘制文本?
您在哪里将新按钮添加到rightSideMenuButtons阵列?

这有用吗?

win.draw(currentButton->GetButtonText());