[英]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
函數都在ASprite
上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 },
// ...
};
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.