c++ - 为什么该代码不绘制精灵 C++ SFML
问题描述
我想在屏幕上绘制精灵,在我的结构中只有关于它的信息,然后在上面绘制文本
信息好 X 和 Y 比例=1 路径好,指向图形位置和旋转 =0;
int free 有一个很好的数字
但是文本有效,所以我不知道为什么雪碧不
我尝试用绘图评论代码并使文本不起作用
struct ObjectInfo
{
float Xpoz,Ypoz;
std::string TexPath;
float Xscale,Yscale;
float Rotation;
};
ObjectInfo OI[1000];
int free;
void Draw()
{
for(int i=0;i<free;i++)
{
sf::Texture t;
t.loadFromFile(OI[i].TexPath);
sf::Sprite s;
s.setTexture(t);
s.setPosition(OI[i].Xpoz,OI[i].Ypoz);
s.setScale(OI[i].Xpoz,OI[i].Ypoz);
s.setRotation(OI[i].Rotation);
okno.draw(s);
sf::Text text;
text.setFont(font);
text.setCharacterSize(48);
text.setColor(sf::Color::Black);
text.setPosition(s.getPosition());
text.setString(IntToString(i));
okno.draw(text);
}
}
我希望精灵和文本显示,但只有文本显示
解决方案
当您调用s.setTexture(t)
sprite 时,s 通过指针/引用记住纹理 t。因此,当您的代码退出 for 循环sf::Texture t
被破坏(退出某个范围时 C++ 破坏范围变量)并且精灵类中的指针/引用指向已删除的内存位置时,这会导致 SFML 在绘制精灵时出错。此问题的解决方案是您使用的纹理的全局数组。我还建议为 sf::Sprites 添加全局数组,因为它使您的代码更安全。以下是它的实现方式:
//In the global scope
sf::Texture textures[1000];
sf::Sprite sprites[1000];
//void draw() new for loop
for(int i=0;i<free;i++)
{
textures[i].loadFromFile(OI[i].texPath);
sprites[i].setTexture(s);
//Set other parameters
okno.draw(s);
sf::Text text;
text.setFont(font);
text.setCharacterSize(48);
text.setColor(sf::Color::Black);
text.setPosition(s.getPosition());
text.setString(IntToString(i));
okno.draw(text);
}
顺便说一句,您的代码还有一些改进。纹理加载操作是一个繁重的操作,所以如果纹理的路径是不可变的,我建议你添加一些方法来一次加载它们。此外,创建文本类可能是一项繁重的操作,因此最好添加sf::Text
您使用的类的全局数组
推荐阅读
- kubernetes - Error: uninstall: Release not loaded: v3.0.0-beta.3: release: not found
- mysql - Get least 10 values in mysql query
- botframework - MS Teams:如何从 ac# 后端向用户发起私人聊天/对话
- kotlin - 从 java 接口实现 setter 作为 kotlin 属性
- eclipse - How to offline install of Spring Boot Tools Plugin into Eclipse IDE?
- javascript - What is the best way to run separate thread in nodejs?
- http - 在颤动中处理服务器响应的通用泛型类
- php - Laravel calcinai/xero-php openssl_pkey_get_private 返回错误错误
- django - Django Rest Framework:允许在父模型中或单独创建子模型
- ios - 滚动 UIView 以扩展到 iPhone X 顶级