将子图形保存为SFML中的数组

问题描述 投票:0回答:2

好吧,我试图创建一个程序来在用户按下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++ c++17 sfml
2个回答
0
投票

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


0
投票

从我快速阅读的内容来看,它们对您的代码有一些问题:

一些不起作用的原因

逗号错误

您似乎像这里用另一种语言一样使用逗号来写意图:

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
© www.soinside.com 2019 - 2024. All rights reserved.