【问题标题】:Draw sprite in draw loop在绘制循环中绘制精灵
【发布时间】:2012-12-03 15:14:59
【问题描述】:

有一个问题,当我试图在绘图循环中绘制一个精灵时,它不会绘制 在这个类的构造函数中,我正在设置精灵。

我拥有的构造函数:

texture.loadFromFile("img1.png");
sprite.setTexture(texture);

精灵和纹理在头文件中

我做了一些实验,如果我在绘图循环中使用texture.loadFromFile();,它就可以工作。 但是我必须每秒“重新加载”图片 60 次。

void PlayerReceiver::draw(sf::RenderWindow & rw){
        //texture.loadFromFile("mario.png");

        //std::cout<<texture.getSize().y<<std::endl;

            rw.draw(sprite);

    }

感谢您的回答。

【问题讨论】:

  • 这个有一个页面:sfml-dev.org/tutorials/1.4/graphics-sprite.php我的猜测是你每次都销毁对象,因此需要重新加载,因为内存不再存在了
  • 我的 palantir 告诉我 spirtetexture 是在本地定义的
  • 问题是它不会因为循环而绘制(但我不明白为什么它应该工作),如果我把它放在我的主要上它工作正常。很好的答案谢谢你们试一试
  • 另请注意,您不会每秒“重新加载”图片 60 次。加载后,使用与参数相同的字符串调用 loadFromFile() 将返回已加载的图像。不是说这是最佳的,只是想澄清一下! ;-)

标签: c++ sprite textures draw sfml


【解决方案1】:

有一个问题,当我试图在绘图循环中绘制一个精灵时 不会在这个类的构造函数中绘制我正在设置精灵。

根据我从这个问题的理解,您想在构造函数中加载纹理和精灵,当您尝试从绘制循环中绘制它时它不起作用。

我有一个程序可以在构造函数中加载纹理并且运行良好,所以我认为是错误的(我不确定,因为在上面的帖子中我没有看到你的程序的六行)是纹理和精灵对象不是在类级别上定义的。

这是我正在使用的纹理对象的头文件:

class GraphPaper
{
    public:
        GraphPaper();
        ~GraphPaper();
        bool isObjectLoaded();
        sf::Sprite getSprite();

    private:
        void load(std::string filename);
        bool isLoaded;

        sf::Texture texture;
        sf::Sprite sprite;

        const std::string file = "images/Graph-Paper.png";
};

纹理和精灵对象作为私有成员在类范围级别上列出,并通过 getter 方法访问。

这是该类的构造函数(稍作改动以更好地匹配您想要完成的内容):

#include "GraphPaper.h"

GraphPaper::GraphPaper() //: isLoaded(false)
{
    if (texture.loadFromFile(file) == false)
        isLoaded = false;
    else
    {
        texture.setRepeated(true);
        sprite.setTexture(texture);
        isLoaded = true;
    }
    //load(file);
    assert(isObjectLoaded());
}

在此之后,我只需绘制我的“GraphPaper”对象。

mainWindow.draw(paper.getSprite());

我已经可以访问它,因为我在 MainWindow 头文件中定义了一个名为“paper”的“GraphPaper”对象。

#pragma once
#include "GraphPaper.h"
#include "stdafx.h"

class MainWindow
{
    public:
         void close();
         void start();
         void moveCamera(sf::Event);

    private:
        bool leftMousePressed, rightMousePressed, isExiting;
        int r, g, b, mouseX, mouseY;

        GraphPaper paper;

        const sf::Color white = sf::Color(255, 255, 255);

        sf::RenderWindow mainWindow;
        sf::View view;
};

假设这是您想要做的,那么您的问题很可能在头文件中。在类级别上定义的任何对象,一旦加载,在类本身被销毁之前都不会被销毁。也许您需要确保不会破坏对构造函数所在类的引用。例如,如果您在循环中创建类的实例,则循环结束的那一刻类对象将被破坏。

【讨论】:

  • Annnnd,jsut 意识到这就像 3 岁。哦,好吧。
  • 但这是一个很好的答案,可能会帮助其他人,所以不是完全浪费!
【解决方案2】:

只是一个假设:你的构造函数中有这个:

PlayerReceiver::PlayerReceiver()
{
    sf::Texture texture;
    texture.loadFromFile("img1.png");
    sprite.setTexture(texture);
}

这样纹理对象在构造函数结束后立即被销毁。 spritetexture 都必须是该类的成员,以便在玩家本身被销毁之前它们不会被销毁。

如果这不是您的问题,请发布更多代码。

【讨论】: