好吧,我试图创建一个程序来在用户按下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();
}
是的,我知道我可以写一封我想作为图像的字母。感谢您的帮助,我对所有这些都是新的。
C ++中的逗号运算符是许多初学者的常见起点。它计算其中的所有表达式(并考虑到它们的副作用),但仅返回最右边的值。
Sprite["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ASprite, DSprite, ESprite, QSprite, SSprite, WSprite, XSprite, ZSprite, EscSprite;
是等效的(因为各种逗号表达式的操作数都没有副作用):
Sprite["Esc"] = EscSprite;
我很好奇是否按Esc
会按预期绘制EscSprite
。
您问,“为什么当我尝试从地图访问“ A”键时程序为什么不会崩溃?
Key.draw(Sprite[key]);
答案是[]
上的std::map
运算符将检索该键上的值,除非该键不存在,在这种情况下它将默认构造该值并返回that。
从我快速阅读的内容来看,它们对您的代码有一些问题:
一些不起作用的原因
逗号错误
您似乎像这里用另一种语言一样使用逗号来写意图:
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;
复制粘贴错误
setTexture
上的每个ASprite
函数都被调用,我认为这不是您的意图。
多样化建议
一次初始化
您绝对不应从渲染(或任何)循环中的同一文件加载,因为这是一项非常昂贵的操作。即使精灵创建也只能执行一次,避免了每帧的创建成本。
一致规范
您有一些以大写字母开头的变量,有些则没有,请尝试在此处保持一致。 [C++ Core Guidelines]中指定的>
多样化
sf::Style::None; //<This line doesn't do anything