【问题标题】:C++ SFML Sprite not being drawn through classesC++ SFML Sprite 未通过类绘制
【发布时间】:2014-07-30 20:34:56
【问题描述】:

(不,我不是指显示精灵的基础知识。我只是想不出更好的标题,因为我不完全理解出了什么问题。)

简单地说,我有一个精灵,当被绘制到屏幕上时,它不会显示出来,但是如果我通过在int main() 中制作临时精灵进行一些测试并将它们绘制到屏幕上,它们会显示得非常好.所以我知道我在类的设计上做错了什么,因为它们是精灵不会显示的地方。

(注意:我所有的类都在 rpg:: 的命名空间下,我将把它删掉以节省空间,但我可能会不假思索地在我的代码中使用它 - 以便消除可能发生的任何混淆)

代码:

rpg.h:

static sf::Texture PlayerTexture;

/*
    NOTE: Loads in All Textures for use
          --This works properly (tested)
*/
static void SetUp()
{
    if(!PlayerTexture.loadFromFile("C:/Program Files (x86)/Terentia/Files/Textures/player.png"))
    {
        std::cout<<"Error: texture failed to load..."<<std::endl;
    }
}

AbstractComponents.h

//Abstract class for handling graphics
class GraphicsComponent : public rpg::Component, public sf::Drawable
{
protected:
    sf::Sprite mySprite;

public:
    virtual void HandleEvents(GameObject& object, sf::RenderWindow& screen, rpg::EventList& events) = 0;

//Copy Constructor
GraphicsComponent(const GraphicsComponent& me) {
    mySprite = me.mySprite; }

GraphicsComponent& GraphicsComponent::operator= (const GraphicsComponent &me){
    mySprite = me.mySprite; }

GraphicsComponent() {}
virtual ~GraphicsComponent() {}
};

PlayerGraphicsComponent.h

class PlayerGraphicsComponent : public rpg::GraphicsComponent
{

public:

virtual void Receive(rpg::Message message);

virtual void HandleEvents(GameObject& object, sf::RenderWindow& screen, rpg::EventList& events);

PlayerGraphicsComponent() { mySprite.setTexture(rpg::PlayerTexture); }
~PlayerGraphicsComponent();

private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
    //Draw sprite onto the screen.
    target.draw(mySprite, states);

}//needed to make drawable
};

GameObject.h

class GameObject : public rpg::ContainerObject, public sf::Drawable
{
public:
sf::Vector2f myPosition;

rpg::Movable CanMove;

GameObject();
GameObject(std::shared_ptr<InputComponent> input,
            std::shared_ptr<GraphicsComponent> graphics,
            std::shared_ptr<PhysicsComponent> physics )
:   myInput(input),
    myGraphics(graphics),
    myPhysics(physics)
{myPosition.x = 0;
myPosition.y = 0;}

//Copy Constructor
GameObject(const GameObject& me) {
    myInput = me.myInput;
    myGraphics = me.myGraphics;
    myPhysics = me.myPhysics;
    myPosition = me.myPosition; }

GameObject& GameObject::operator= (const GameObject &me);

~GameObject();

void HandleEvents(sf::RenderWindow& screen, rpg::EventList& events)
{
    myInput->HandleEvents(*this, screen, events);
    myPhysics->HandleEvents(*this, screen, events);
    myGraphics->HandleEvents(*this, screen, events);
}

private:
std::shared_ptr<InputComponent>     myInput;
std::shared_ptr<GraphicsComponent>  myGraphics;
std::shared_ptr<PhysicsComponent>   myPhysics;


private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
    target.draw(*myGraphics, states);

}//needed to make drawable
};http://stackoverflow.com/questions/13899077/c-sfml-display-glitch-with-sprite-member-changed-by-mouseclick

main.cpp

int main()
{
//Loads in all textures, info, etc
rpg::SetUp(); 

//Create Player Object
ptrGameObject player = rpg::CreatePlayer();

//Create render window and give it it's info
sf::RenderWindow screen;
screen.create(sf::VideoMode(800, 640), "Terentia", sf::Style::Close);

screen.setVerticalSyncEnabled(1); // Setting max framerate to 60 (Facultative)
screen.setFramerateLimit(60); // Setting max framerate to 60 (Facultative)

rpg::EventList eventList;

while(screen.isOpen())
{
    sf::Event events;
    while(screen.pollEvent(events))
    {
        eventList.push_back(events);
        if (events.type == sf::Event::Closed)
        {
            screen.close();
        }
    }

    //Handle Object Events here
        player->HandleEvents(screen, eventList);
    //End Object Handle Events

    eventList.clear();

    //temp sprite for test
    std::shared_ptr<sf::Sprite> tempSprite(new sf::Sprite());

    tempSprite->setTexture(rpg::PlayerTexture);

    screen.clear();

    //Doesn't draw to screen
    screen.draw(*player);

    //Does draw to screen.
    screen.draw(*tempSprite);

    screen.display();

}

return 0;
}

我知道这里有大量代码,但我相信至少其中大部分是相关的。我一点也不知道为什么图形组件中的精灵不显示,但是临时精灵工作得非常好,即使两个精灵的纹理都指向相同的纹理。我的猜测是我在类中的绘制函数做错了,但它们对我来说看起来不错。我认为我的另一件事是对象的精灵由于某种原因没有保留纹理,但我让它在其HandleEvents() 函数中将其纹理设置为rpg::PlayerTexture,以便它可以确定设置纹理,但这也没有解决它。我对此完全不知所措,这可能很简单。

感谢您花时间阅读所有这些内容,如果可以的话,我希望能解释一下问题出在哪里。谢谢

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    当您将类的成员声明为静态时,这意味着无论创建多少类对象,静态成员都只有一个副本。您需要将其声明为“extern”。 extern sf::Texture PlayerTexture

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多