我正在使用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()时,程序崩溃。这样我可以在按钮中绘制文本。我收到一个错误消息,说它无法读取内存中的该位置(Volation d'accèslors de la演讲的位置)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属性。希望这对你们有所帮助。

最佳答案

检查这些:


确保您的文字字体正确
给您的文字加上颜色
渲染前给它一个字符串


这是我引擎中的一个函数,可以向游戏添加文本:

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;
    }
}


等视觉的安装;)

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

这有效吗?

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

07-24 12:42