【发布时间】:2012-08-20 07:31:59
【问题描述】:
当这个函数运行时,我得到了sprite = spr; 行标题中描述的调试断言错误。如果我在此之前添加sprite.reset();,它会在sprite.reset(); 的行上崩溃。指针被存储在其他地方,在static std::map<std::string,sf::Sprite> ResourceManager::sprites;,所以我也不希望为 sf::Sprite 调用析构函数(尽管我怀疑这可能是因为它们被存储在静态对象中...... ?)
VisibleGameObject.h
#ifndef VISIBLEGAMEOBJECT_H
#define VISIBLEGAMEOBJECT_H
#include "Game.h"
//just for keeping track of the sprite and drawing
class VisibleGameObject{
public:
VisibleGameObject(){}
VisibleGameObject(const std::string& name);
~VisibleGameObject();
std::string getTextureName();
void setSprite(const std::string& textureName);
void setSprite(const sf::Texture& texture);
void setSprite(std::shared_ptr<sf::Sprite> sprite);
void setPosition(float x,float y);
void setPosition(const sf::Vector2f& position);
void setRotationDegrees(float degrees);
void setRotationRadians(float radians);
float getRotationDegrees();
float getRotationRadians();
void setOrigin(float x,float y);
void setOrigin(const sf::Vector2f& origin);
sf::Vector2f getSize();
sf::Vector2f getOrigin();
sf::Vector2f getPosition();
std::shared_ptr<sf::Sprite> getSprite();
void draw(tgui::Window* wnd);
private:
std::string name;
std::shared_ptr<sf::Sprite> sprite;
std::string texture_name;
bool _loaded;
};
#endif
从 VisibleGameObject.cpp 中提取
//'sprite' is initialised here
void VisibleGameObject::setSprite(const std::string& textureName){
sprite = std::shared_ptr<sf::Sprite>(ResourceManager::createSpriteFromStoredTexture(textureName,name));
texture_name = textureName;
_loaded = true;
}
//error function!
void VisibleGameObject::setSprite(std::shared_ptr<sf::Sprite> spr){
sf::Vector2f p(0,0);
float d = 0;
if(_loaded){
p = spr->getPosition();
d = spr->getRotation();
}
sprite = spr;
sprite->setPosition(p);
sprite->setRotation(d);
_loaded = true;
}
从 ResourceManager.cpp 中提取
sf::Sprite* ResourceManager::createSpriteFromStoredTexture(const std::string& texturename,const std::string& spritename){
sf::Sprite spt;
spt.setTexture(*getTextureByName(texturename));
std::string name = spritename;
if(spritename == standard_spt_name){
name = spritename+std::to_string((long long)spritecount);
spritecount++;
}
sprites[name] = spt;
return &sprites[name];
}
VisibleGameObject 在使用时似乎可以正常工作,而无需使用最初描述为问题的 setSprite 函数更改 sprite。
【问题讨论】:
-
这是一个多线程程序吗? sprite 是可以从另一个线程访问的变量,并且在您执行此写入的同时被读取?
-
你能说明精灵是在哪里定义和初始化的吗?
-
另外,你是如何创建你正在传递的
shared_ptr<sf::Sprite>的?如果sf::Sprite保存在地图中,为什么要将其放入 shared_ptr 中? -
戴夫 S:见编辑。它作为资源系统的 shared_ptr 保存在 ResourceManager 中的静态地图中,但实际对象(VisibleGameObject)也需要跟踪它。
标签: c++ visual-studio-2010 c++11 shared-ptr sfml