在绘制循环中绘制精灵

时间:2012-12-03 15:15:00

标签: c++ sprite textures draw sfml

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

我有构造函数:

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

    }

感谢您的回答。

2 个答案:

答案 0 :(得分: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());
}

在此之后,我只需绘制我的&#34; GraphPaper&#34;对象

mainWindow.draw(paper.getSprite());

我已经可以访问它,因为我定义了一个&#34; GraphPaper&#34;被称为&#34;纸张的对象&#34;在我的MainWindow头文件中。

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

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

答案 1 :(得分:0)

只是一个假设:你的导师有这个:

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

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

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