簡體   English   中英

在 SFML 中將精靈保存為數組

[英]Saving Sprites as Arrays in SFML

好吧,所以我正在嘗試創建一個程序,當用戶按下 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函數都在ASpriteASprite ,我認為這不是您的意圖。

多樣的建議

初始化一次

你不應該在你的渲染(或任何)循環中從同一個文件加載,因為這是一個非常昂貴的操作。 甚至精靈的創建也只能完成一次,避免了每幀的創建成本。

一致的規范

你有一些以大寫字母開頭的變量,有些不是,盡量在這里保持一致。 按照C++ 核心指南中的規定

其他

sf::Style::None; //<This line doesn't do anything

編輯

要以 C++ 方式解決逗號錯誤,請使用 map 的初始值設定項列表:

map<string, sf::Texture> Tex;
Tex = {
    { "A", ATex },
    { "B", BTex },
    { "C", CTex },
    // ...
};

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按預期繪制EscSprite


你會問,“為什么當我嘗試從地圖訪問“A”鍵時程序沒有崩潰?

Key.draw(Sprite[key]);

答案是std::map上的[]運算符將檢索該鍵處的值,除非該鍵不存在,在這種情況下,它將默認構造該值並返回

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM