Сохранение спрайтов в виде массивов в SFML - PullRequest
0 голосов
/ 18 марта 2020

Хорошо, поэтому я пытаюсь создать программу, которая рисует aws изображение А, когда пользователь нажимает А. Я не дошел до этого места, но просто чтобы вы поняли, какова конечная цель. В любом случае я пытался создать функцию с именем 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();
        }

Да, я знаю, я могу заставить его написать письмо, которое я хочу в качестве изображения. Спасибо за вашу помощь, я новичок во всем этом.

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Есть несколько проблем с вашим кодом из того, что я прочитал:

Несколько причин, по которым он не работает

Ошибка запятой

Вы Кажется, вы используете запятую, чтобы написать свое намерение, как на другом языке здесь:

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;.

То же самое будет и с line

Sprite["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ASprite, DSprite, ESprite, QSprite, SSprite, WSprite, XSprite, ZSprite, EscSprite;

Позже, когда вы попытаетесь использовать, например, Tex ["A"], он создаст новую пустую текстуру, которую вы никогда не указывали.

Копирование вставки ошибка

Каждая setTexture функция вызывается на ASprite, я не думаю, что это ваше намерение здесь.

Различные советы

Инициализируйте один раз

Вы никогда не должны загружать из одного и того же файла в вашем рендеринге (или любом другом) l oop, поскольку это очень дорогостоящая операция. Даже создание спрайта может быть выполнено только один раз, избегая затрат на создание каждого кадра.

Согласованная норма

У вас есть несколько переменных, которые начинаются с заглавной буквы, некоторые нет, попробуйте быть последовательным здесь. как указано в C ++ Core Guidelines

Other

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

Редактировать

Для решения ошибки запятой способом c ++ , используйте список инициализаторов карты:

map<string, sf::Texture> Tex;
Tex = {
    { "A", ATex },
    { "B", BTex },
    { "C", CTex },
    // ...
};
1 голос
/ 18 марта 2020

Оператор запятой в C ++ является распространенным явлением для многих начинающих. Он оценивает все выражения в нем (и учитывает их побочные эффекты), но возвращает только самое правое значение.

Sprite["A", "D", "E", "Q", "S", "W", "X", "Z", "Esc"] = ASprite, DSprite, ESprite, QSprite, SSprite, WSprite, XSprite, ZSprite, EscSprite;

эквивалентно (поскольку ни один из операндов различных выражений запятой не имеет побочных эффектов) на:

Sprite["Esc"] = EscSprite;

Мне любопытно, если вы нажмете Esc др aws EscSprite, как ожидалось.


Вы задаете вопрос: «Ну, почему нет программа cra sh, когда я пытаюсь получить доступ к клавише "A" с карты?

Key.draw(Sprite[key]);

Ответ заключается в том, что оператор [] в std::map будет извлекать значение для этого ключа , если этот ключ не существует, в этом случае он по умолчанию создаст значение и вернет , что .

...