【问题标题】:Texture going out of scope in SFMLSFML 中的纹理超出范围
【发布时间】:2014-03-23 19:54:37
【问题描述】:

嗯,我正在尝试使用 SFML 2.1 制作菜单。我有一个“something.h”头文件和两个源文件。对于按钮,我创建了一个纹理文件。现在,由于我希望所有菜单按钮都具有相同的纹理,因此我试图全局声明纹理。我尝试了几种方法来做到这一点。我试图在 something.h 中的所有类声明之前声明它,但我发现你不能在没有函数的情况下使用 texture.loadFromFile("blahblah")。所以,我决定为此做一个类,下面是代码。

某事.h

#include<SFML/Graphics.hpp>
#include<iostream>
class Textureinitialize
{
public:
    sf::Texture texture;
    sf::Font font;
    void loadtexture(const std::string& texturestring);       //Specify file-name of texture
    void loadfont(const std::string& fontstring);             //Specify file-name of font
};
class Menubutton
{
public:
    sf::Sprite menubuttonsprite;
    sf::Text menubuttontext;
    sf::Vector2i spritekaposition;
    void loadthesprite(Textureinitialize obj1);               //Load sprite from Texture and Text from font
    void loadtexturepos(sf::IntRect rect1);                   //Load the sprite rectangle from the Texture
    void spriteposition(sf::Vector2i originpos);              //Specify position of button on the screen
    void texttodisplay(std::string displaystring);            //String to be displayed in button
    void positionoftext(sf::Vector2i textpos,int textsize);   //Set position and size of text to be displayed
};

这没有出错,但菜单按钮精灵没有显示在屏幕上。我认为问题在于纹理的加载。我环顾四周,发现不知何故纹理超出了范围。请问谁能帮帮我?

编辑:
我想更多的代码是小时的需要。这是我提到的两个源文件的内容。

Something.cpp

#include "Menudata.h"
void Textureinitialize::loadtexture(const std::string& texturestring)
{
    if(!texture.loadFromFile(texturestring))
        std::cout<<"\nFailed to load textures";
}
void Textureinitialize::loadfont(const std::string& fontstring)
{
    if(!font.loadFromFile(fontstring))
        std::cout<<"\nFailed to load font";
}
void Menubutton::loadthesprite(Textureinitialize obj1)
{
        menubuttonsprite.setTexture(obj1.texture);
        menubuttontext.setFont(obj1.font);
}
void Menubutton::spriteposition(sf::Vector2i originpos)
{
    spritekaposition.x=originpos.x;
    spritekaposition.y=originpos.y;
    menubuttonsprite.setPosition(originpos.x,originpos.y);
}
void Menubutton::loadtexturepos(sf::IntRect rect1)
{
    menubuttonsprite.setTextureRect(rect1);
}
void Menubutton::texttodisplay(std::string displaystring)
{
    menubuttontext.setString(displaystring);
}
void Menubutton::positionoftext(sf::Vector2i textpos,int textsize)
{
    menubuttontext.setPosition(spritekaposition.x+textpos.x,spritekaposition.y+textpos.y);
    menubuttontext.setCharacterSize(textsize);
    menubuttontext.setColor(sf::Color::Red);
}

Main.cpp

#include "Menudata.h"
int main()
{
    Textureinitialize a;
    a.loadtexture("Menubutton.tga");
    a.loadfont("arial.ttf");
    Menubutton b;
    b.loadthesprite(a);
    b.loadtexturepos(sf::IntRect(0,0,80,48));
    b.spriteposition(sf::Vector2i(50,50));
    b.texttodisplay("Hello!");
    b.positionoftext(sf::Vector2i(50,14),20);
    sf::RenderWindow window(sf::VideoMode(200,200),"My Window");
    while(window.isOpen())
    {
        sf::Event event;
        while(window.pollEvent(event))
        {
            if(event.type==sf::Event::Closed)
                window.close();
            if(event.type==sf::Event::MouseButtonPressed)
            {
                b.loadtexturepos(sf::IntRect(0,48,80,48));
                if(event.mouseButton.button==sf::Mouse::Left)
                    std::cout<<"\nHello!!!";
            }
            if(event.type==sf::Event::MouseButtonReleased)
                b.loadtexturepos(sf::IntRect(0,0,80,48));
        }
        window.clear(sf::Color::Green);
        window.draw(b.menubuttonsprite);
        window.draw(b.menubuttontext);
        window.display();
    }
return 0;
}

我认为纹理超出范围的原因是我在 Google 上的某个地方读到,如果您得到的是白色矩形而不是图像,您可能会遇到上述问题。另外,我刚刚注意到我在白框中看不到任何文字。我确实有一个功能可以在“菜单按钮”类的按钮上显示文本。我认为问题可能出在字体的初始化上。我希望我在“Textureinitialize”课程中所做的没有错。我想问题可能出在那儿。

【问题讨论】:

  • 只需确保您的范围扩展到您需要纹理的时间。
  • 如果不发布更多代码,就没有什么可以做的。

标签: c++ sfml


【解决方案1】:

就管理 SFML 资源而言,例如纹理,我只能推荐这个模板:

https://github.com/LaurentGomila/SFML-Game-Development-Book/tree/master/02_Resources/Include/Book

在我看来,这是一种在您需要它来构建按钮时访问纹理的简单方法

P.S.:为了提高代码的可读性,我建议使用 my_function 或 myFunction 等符号,而不是 myfunction(全部小写)。

【讨论】:

  • 可能回答了这个问题。包括您链接到的相关部分。在最坏的情况下,链接会失效,无论如何,当它们自己生存时,答案会更好。使用链接作为参考很好,但请始终问自己:“您的帖子能否独立存在,还是需要单击链接才有意义?”
  • 不要使用可能会过时的链接。拼写/语法检查您的帖子。
  • @smoothware 感谢您的建议。我会记住这一点的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多