2012-12-03 48 views
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); 

    } 

谢谢你的回答。

+0

有一个这样的网页:http://www.sfml-dev.org/tutorials/1.4/graphics-sprite.php我的猜测是你每次销毁对象,因此需要重新加载,因为内存不会'不存在了 – Caribou

+2

我palantir告诉我要么'spirte'或'纹理'在本地定义 – 2012-12-03 15:23:09

+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()); 
} 

此我简单地画我的“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; 
}; 

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

+0

Annnnd,jsut意识到这就像3岁。好吧。 – Acejhm

+0

但这是一个很好的答案,可能会帮助别人,所以不是完全浪费! – Mogsdad

0

只是一个假设:你在你的construtor有这样的:

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

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

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