c++ - 在 SFML 中将 Sprite 保存为数组
问题描述
好吧,所以我正在尝试创建一个程序,当用户按下 A 时,它会绘制 A 的图片。我还没有接近那么远,但只是为了让您了解最终目标是什么。无论如何,我尝试创建一个名为的函数,DrawKey(string key)
我将其设置为没有错误,问题是它没有绘制精灵。我不知道我哪里出错了请帮忙。
static void DrawKey(string key)
{
sf::RenderWindow Key(sf::VideoMode(800, 600), "A");
sf::Style::None;
while (Key.isOpen())
{
//Sprites
map<string, sf::Sprite> Sprite;
map<string, sf::Texture> Tex;
sf::Texture ATex;
ATex.loadFromFile("Assets/Images/A.jpg");
sf::Texture DTex;
DTex.loadFromFile("Assets/Images/D.jpg");
sf::Texture ETex;
ETex.loadFromFile("Assets/Images/E.jpg");
sf::Texture QTex;
sf::Texture STex;
QTex.loadFromFile("Assets/Images/Q.jpg");
STex.loadFromFile("Assets/Images/S.jpg");
sf::Texture WTex;
WTex.loadFromFile("Assets/Images/W.jpg");
sf::Texture XTex;
XTex.loadFromFile("Assets/Images/X.jpg");
sf::Texture ZTex;
ZTex.loadFromFile("Assets/Images/Z.jpg");
sf::Texture EscTex;
EscTex.loadFromFile("Assets/Images/esc.jpg");
Tex["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ATex, DTex, ETex, QTex, STex, WTex, XTex, ZTex, EscTex;
sf::Sprite ASprite;
ASprite.setTexture(ATex);
sf::Sprite DSprite;
ASprite.setTexture(Tex["D"]);
sf::Sprite ESprite;
ASprite.setTexture(Tex["E"]);
sf::Sprite QSprite;
ASprite.setTexture(Tex["Q"]);
sf::Sprite SSprite;
ASprite.setTexture(Tex["S"]);
sf::Sprite WSprite;
ASprite.setTexture(Tex["W"]);
sf::Sprite XSprite;
ASprite.setTexture(Tex["X"]);
sf::Sprite ZSprite;
ASprite.setTexture(Tex["Z"]);
sf::Sprite EscSprite;
ASprite.setTexture(Tex["Esc"]);
Sprite["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ASprite, DSprite, ESprite, QSprite, SSprite, WSprite, XSprite, ZSprite, EscSprite;
// Process events
sf::Event event;
while (Key.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed)
Key.close();
}
// Clear screen
Key.clear(sf::Color::Transparent);
Key.draw(Sprite[key]);
Key.display();
}
是的,我知道我可以让它写一封我想要它作为图像的信。感谢您的帮助,我对这一切都很陌生。
解决方案
从我阅读的内容来看,您的代码存在一些问题:
它不起作用的几个原因
逗号错误
你似乎使用逗号来写你的意图,就像你在这里用另一种语言一样:
Tex["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ATex, DTex, ETex, QTex, STex, WTex, XTex, ZTex, EscTex;
您不能在 C++ 中以这种方式使用逗号。在这里,您使用内置的逗号运算符。如此处所述: https ://en.cppreference.com/w/cpp/language/operator_other
在逗号表达式 E1, E2 中,表达式 E1 被求值,其结果被丢弃(尽管如果它具有类类型,它直到包含完整表达式的末尾才会被销毁),并且它的副作用在求值之前完成表达式 E2 的开头(请注意,用户定义的运算符,不能保证顺序)(直到 C++17)。
这里每个后跟逗号的表达式什么都不做,直到最后一个参数被使用,所以你的表达式只有Tex["Esc"] = EscTex;
.
后面的行也是如此
Sprite["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ASprite, DSprite, ESprite, QSprite, SSprite, WSprite, XSprite, ZSprite, EscSprite;
稍后,当您尝试使用 Tex["A"] 时,它将创建一个新的空纹理,因为您从未指定任何纹理。
复制粘贴错误
每个setTexture
函数都被调用ASprite
,我认为这不是你的意图。
多样化的建议
初始化一次
您永远不应该在渲染(或任何)循环中从同一文件加载,因为这是一项非常昂贵的操作。即使精灵创建也只能完成一次,避免了每帧的创建成本。
一致的规范
您有一些以大写字母开头的变量,有些不是,请尝试在此处保持一致。如C++ 核心指南中所述
其他
sf::Style::None; //<This line doesn't do anything
编辑
要以 c++ 方式解决逗号错误,请使用 map 的初始化列表:
map<string, sf::Texture> Tex;
Tex = {
{ "A", ATex },
{ "B", BTex },
{ "C", CTex },
// ...
};
推荐阅读
- python - 使用 one2many 创建新记录
- python - 覆盖 TF2 优化器类,应用渐变有问题?
- amazon-redshift - 使用 Glue 将数据从 AWS EMR 加载到 Redshift 非常慢
- tensorflow - 字符串获取方法的terraform列表失败
- javascript - 更新 mongoose 中的嵌入文档
- python - ChromeDriver 错误:“chromedriver”可执行文件需要在 PATH 中
- qt - 是否可以在 QML 中仅显示 osm 的一部分?
- ansible - 如何在 cygwin 下配置 ansible 以使用 pageant(使用密码保护密钥运行 ansible)
- python - 如何格式化分区问题的幸福来读取幸福表?
- flutter - 无法更改颤振主题颜色