c++ SFML精灵不能通过类绘制
C++ SFML Sprite not being drawn through classes
(不,我指的不是显示精灵的基本知识。我简直想不出一个更好的标题,因为我不完全明白哪里出了问题。
简单地说,我有一个精灵,当被绘制到屏幕上时,它不会显示出来,但如果我在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;
}
我知道这里有大量的代码,但我相信至少其中大部分是相关的。我不知道为什么图像组件中的精灵没有显示出来,但是临时精灵运行得很好,即使两个精灵的纹理都指向相同的纹理。我的猜测是我在类内部的draw函数中做错了什么,但对我来说它们看起来很好。另一件事,我认为我的是,对象的精灵没有保持纹理出于某种原因,但我使它设置其纹理rpg::PlayerTexture
在其HandleEvents()
函数,以便它会设置纹理肯定,但这并没有解决它。我完全搞不懂,可能是什么简单的东西。
感谢您花时间阅读所有这些内容,如果您可以的话,我希望您能解释一下为什么这个问题是问题。由于
当你将一个类的成员声明为静态时,这意味着无论创建多少个类的对象,都只有一个静态成员的副本。您需要将其声明为"extern"。extern sf::Texture PlayerTexture
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL不能在核心配置文件中使用glVertexAttrib进行绘制
- 为什么我不能在SDL2中绘制纹理
- OpenGL 3.3不能绘制任何东西
- 不能重复使用画笔来绘制文本和矩形
- z缓冲区导致东西不能绘制
- c++ SFML精灵不能通过类绘制
- 使用OpenGL ES 2.0的SDL2 -不能在iOS上绘制简单的三角形