首页 > 解决方案 > 在 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();
        }

是的,我知道我可以让它写一封我想要它作为图像的信。感谢您的帮助,我对这一切都很陌生。

标签: c++c++17sfml

解决方案


从我阅读的内容来看,您的代码存在一些问题:

它不起作用的几个原因

逗号错误

你似乎使用逗号来写你的意图,就像你在这里用另一种语言一样:

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 },
    // ...
};

推荐阅读