C++返回 sf::纹理时遇到问题



我正在尝试将所有纹理存储在一个数组中。 但是图像没有返回,似乎这是我的代码

我假设我的 loadTex 和 loadSpri 函数会返回并将它们数据存储在我制作的数组中,但它似乎不是那样工作的,因为当我运行游戏时它们不会出现,只是空白。我的代码可能看起来很糟糕,但我仍然是初学者,并试图掌握窍门

这是渲染图.cpp

#include "render.h"

texandsprite render::textures[5];

sf::Texture loadTex(std::string);
sf::Sprite loadSpri(sf::Texture);
//Function to start the game
void render::start()
{

_mainWindow.create(sf::VideoMode(1024, 768, 32), "A New Life");
textures[1].tex = loadTex("civilian.png");
textures[1].spri = loadSpri(textures[1].tex);
GameLoop();
}

void render::GameLoop()
{

sf::Event event;
//Load(1, "civilian.png");
float x = 0;
float y = 0;
    while(_mainWindow.isOpen())
    {
        while (_mainWindow.pollEvent(event))
        {
            //Check the type of event
            switch (event.type)
            {
                    //window closed
                case sf::Event::Closed:
                    _mainWindow.close();
                    break;
                case sf::Event::KeyPressed:
                    switch(event.key.code)
                    {
                        case sf::Keyboard::Up:
                            --y;
                            break;
                        case sf::Keyboard::Down:
                            y += 5;
                            break;
                        case sf::Keyboard::Right:
                            ++x;
                            break;
                        case sf::Keyboard::Left:
                            --x;
                            break;
                    }

                    break;

                default:
                    break;
            }
        }
    _mainWindow.clear(sf::Color::White);
    //Draw everything here
    //_mainWindow.draw(...);
    textures[1].spri.setPosition(x,y);
    _mainWindow.draw(textures[1].spri);
    //End the current frame
    _mainWindow.display();

    }
}
sf::RenderWindow render::_mainWindow;
sf::Texture render::loadTex(std::string filename)
{
sf::Texture temptex;
if(!temptex.loadFromFile(filename))
{
    std::cout << "Error: could not load image" << filename << std::endl;
}
std::cout << filename << " Loaded" << std::endl;

return temptex;
}
sf::Sprite render::loadSpri(sf::Texture temptex)
{
sf::Sprite tempspri;
tempspri.setTexture(temptex);
return tempspri;
}

这是渲染.h

#ifndef RENDER_H_INCLUDED
#define RENDER_H_INCLUDED
#include "SFML/Window.hpp"
#include "SFML/Graphics.hpp"
#include <iostream>
struct texandsprite
{
    sf::Texture tex;
    sf::Sprite spri;
};

class render
{
public:
    static void start();
    //Here will go a list of all moving entities
    static texandsprite textures[5];
    //Here will go a list of all nonmoving entities
    //static
private:
    static void GameLoop();
    static void Rendering();
    static sf::Texture loadTex(std::string);
    static sf::Sprite loadSpri(sf::Texture);
    static sf::Texture texture;
    static sf::Sprite sprite;
    static sf::RenderWindow _mainWindow;
};

#endif // RENDER_H_INCLUDED
sf::Sprite render::loadSpri(sf::Texture temptex)
{
    sf::Sprite tempspri;
    tempspri.setTexture(temptex);
    return tempspri;
}

这与sf::纹理作为类成员不起作用?非常相关。也看看我的回答。

发生的情况是,你的子画面被设置为显示temptex但当函数返回时,这个纹理被破坏了,因为它是按值传递给函数的。

可以通过改用对sf::Texture的引用来解决此问题。


有关您的评论的更多详细信息,请参见下文。我稍微简化了您的情况和代码,以突出显示真正需要理解的内容。

生成具有如下所示loadTexture()纹理很好,因为只有返回的副本可供用户访问——他无法设置精灵以使用原始纹理,因此他不会患上白色方块综合症。

sf::Texture loadTexture(std::string name)
{
    sf::Texture ret;
    if (!ret.loadFromFile(name)) { doSomethingAboutIt(); }
    return ret;
}

关于loadSprite()函数,您可以使用 const ref 按如下方式sf::Texture以防止任何复制,从而防止出现白色方块问题。

sf::Sprite loadSprite(sf::Texture const& tex)
{
    sf::Sprite ret(tex);
    return ret;
}

但是仍然有一个陷阱:你必须小心你如何存储loadTexture()返回的纹理!这种纹理的寿命应该和你的精灵的寿命一样长。您的上面代码(以及下面供参考)应该可以工作:

void render::start()
{
    _mainWindow.create(sf::VideoMode(1024, 768, 32), "A New Life");
    textures[1].tex = loadTexture("civilian.png");
    textures[1].spri = loadSprite(textures[1].tex);
    GameLoop();
}

相关内容

  • 没有找到相关文章

最新更新