1

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

构造函数我有:

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

    }

谢谢你的回答。

4

2 回答 2

1

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

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

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

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

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

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

于 2016-04-28T00:21:04.977 回答
0

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

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

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

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

于 2012-12-15T16:43:30.797 回答