C++ SFML Sprite not being drawn through classes
(不,我不是说显示sprite的基本知识。我只是没有想到一个更好的标题,因为我不完全了解出了什么问题。)
简单地说,我有一个sprite,当被绘制到屏幕上时,它不会显示,但是如果我通过在
(注意:我所有的类都在
代码:
rpg.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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; } |
我知道这里有很多代码,但是我相信至少其中大部分是相关的。关于图形组件中的子画面为什么不显示,我没有丝毫的想法,但是即使两个子画面的纹理都指向相同的纹理,临时子画面也可以正常工作。我的猜测是,我在类内部的draw函数做错了什么,但对我来说它们看起来不错。我认为我的另一件事是该对象的sprite由于某种原因未保留纹理,但我在其
感谢您抽出宝贵的时间阅读所有这些内容,如果可以的话,我很乐意为您解释为什么问题出在问题上。谢谢
当您将某个类的成员声明为静态成员时,这意味着无论创建了多少个该类的对象,静态成员只有一个副本。您需要将其声明为" extern "。