SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Загрузка изображения по номеру pic.loadFromFile("img/N.png");
В этой теме 11 ответов, 2 участника, последнее обновление Heisenberg 8 года/лет, 2 мес. назад.
-
АвторСообщения
-
Есть набор изображений. Нужно загрузить изображение с указанным номером. Что-то вроде(после N может стоять ещё набор символов не определяющих номер img/Nhero.png/ или img/Nmonster):
C++12int N = 102;pic.loadFromFile("img/N.png");Разумеется в таком виде код не работает. Как его правильно написать? Заранее спасибо.
(C++ Visual & SFML)P.S. Не по теме, но всё же: как работают файлы вида DATA(хранилища файлов(звуки, спрайты, текстуры и т.д.)) Буду рад советам и ссылкам на ресурсы с информацией.
C++1for(int i = 0; i < n; i++) loadFromFile(fly[i], "filename_"+std::to_string((int)i+1)+".png"); //+1 если номирация файлов начинается с еденицыСпасибо. Пару моментов:
C++1Image pic; int n = 2; for (int i = 0; i < n; i++) loadFromFile(fly[i], "img/" + std::to_string((int)i + 1) + ".png");Идентификатор loadFromFile не определен, fly тоже самое, n сразу исправил.
Изменил:
C++1Image pic; int n = 2; for (int i = 0; i < n; i++) pic.loadFromFile(fly[i], "img/" + std::to_string((int)i + 1) + ".png");fly остался прежним, “img/” ошибка слишком много аргументов в вызове функции.
Чтобы такого сделать с fly не получается допереть.
Да это моя не внимательность, скопировал код из своего проекта…
Вот так должно быть.C++1int n = 2; for (int i = 0; i < n; i++) pic[i].loadFromFile("img/" + std::to_string((int)i + 1) + ".png");тчк
Вложения:
You must be logged in to view attached files.Осталась последняя загадка на миллион:
Как используя массив и клавиатуру заставить менять текущий элемент массива на другой(выведено на экран 2.png после нажатия if (Keyboard::isKeyPressed(Keyboard::Return) выводится 3.png)?Даже если убрать массив(при малом числе файлов от него проку мало, но всё равно полезен)
C++12int i = 1;pic.loadFromFile("img/" + std::to_string((int)i + 1) + ".png");То всё равно компилятор жалуется на то что i(ниже) не инициализированная локальная переменная.
C++12345if (Keyboard::isKeyPressed(Keyboard::Return)){int i = i + 1;pic.loadFromFile("img/" + std::to_string((int)i + 1) + ".png");}#include<sstream> подключена?
Да но он всё равно жалуется на pic[i] – отсутствует оператор “[]” соответствующий этим операндам Типы операндов sf::Image [int].
C++12345Image pic;int i = 1;int n = 4; for (int i = 1; i < n; i++)pic[i].loadFromFile("img/" + std::to_string((int)i + 1) + ".png");Vector2u size = pic.getSize();P.S. С каждой решенной проблемой чувствую себя всё большим идиотом неспособным найти ответ в решении схожих проблем(форумы читаю, но конкретно о SFML таких проблем не нахожу).
Я всё равно не вижу особого смысла в массиве. Что с ним что без него реакции на клавиатуру нету.C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include <SFML/Graphics.hpp>#include<Windows.h>#include <iostream>#include<sstream>using namespace sf;int main(){RenderWindow window(VideoMode::getDesktopMode(), "SFML Test", Style::Fullscreen);Image pic;int i = 1;pic.loadFromFile("img/" + std::to_string((int)i) + ".png");Vector2u size = pic.getSize();Texture picfon;picfon.loadFromImage(pic);Sprite fon;fon.setTexture(picfon);while (window.isOpen()){sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed ||(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape))window.close();}if (Keyboard::isKeyPressed(Keyboard::Left)){fon.setScale(static_cast<float>(window.getSize().x) / size.x,static_cast<float>(window.getSize().y) / size.y);}if (Keyboard::isKeyPressed(Keyboard::Right)){fon.setScale(1, 1);}if (Keyboard::isKeyPressed(Keyboard::Up)){float xsize = (static_cast<float>(window.getSize().x) / size.x);fon.setScale(xsize , xsize);}if (Keyboard::isKeyPressed(Keyboard::Down)){float ysize = (static_cast<float>(window.getSize().y) / size.y);fon.setScale(ysize , ysize);}if (Keyboard::isKeyPressed(Keyboard::Return)){int i = i + 1;pic.loadFromFile("img/" + std::to_string((int)i) + ".png");}window.clear(Color::White);window.draw(fon);window.display();}return 0;}Не говоря уже о том что жалобы на не инициализированную локальную переменную продолжаются.
Я явного где-то сильно напортачил.
Image pic[4]; сделай массивом
Выражение pic должно иметь тип класса.
C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758int main(){RenderWindow window(VideoMode::getDesktopMode(), "SFML Test", Style::Fullscreen);Image pic[10];int i = 1;pic[i].loadFromFile("img/" + std::to_string((int)i) + ".png");Vector2u size = pic[i].getSize();Texture picfon;picfon.loadFromImage(pic[i]);Sprite fon;fon.setTexture(picfon);while (window.isOpen()){sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed ||(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape))window.close();}if (Keyboard::isKeyPressed(Keyboard::Left)){fon.setScale(static_cast<float>(window.getSize().x) / size.x,static_cast<float>(window.getSize().y) / size.y);}if (Keyboard::isKeyPressed(Keyboard::Right)){fon.setScale(1, 1);}if (Keyboard::isKeyPressed(Keyboard::Up)){float xsize = (static_cast<float>(window.getSize().x) / size.x);fon.setScale(xsize , xsize);}if (Keyboard::isKeyPressed(Keyboard::Down)){float ysize = (static_cast<float>(window.getSize().y) / size.y);fon.setScale(ysize , ysize);}if (Keyboard::isKeyPressed(Keyboard::Return)){i++;pic[i].loadFromFile("img/" + std::to_string((int)i) + ".png");picfon.loadFromImage(pic[i]);}window.clear(Color::White);window.draw(fon);window.display();}return 0;}Нет. Просто нет.
Во-первых ради разнообразия запустите. Это крайне интересное зрелище.(просто скачайте пару файлов РАЗНОГО размера)
Во-вторых а без массива ВООБЩЕ никак? Это довольно неудобный инструмент. Да он помогает если необходимо загрузить ОДНОВРЕМЕННО группу данных, но не здесь.
В любом случае спасибо. Теперь либо буду ломать голову над тем как сделать код человечным, или перейду на другую графическую среду, или заброшу это дело.
Ваш случай и есть тот самый, в котором нужно загрузить коллекцию текстур и одевать её по [id] по надобности, а не загружать новую текстуру каждый раз в игровом процессе.
Их нужно подгрузить заранее, иначе это плохо отразится на производительности вашего приложения, а именно будет некая задержка на загрузку текстуры прям во время игры!
Чем вас мой класс из 4 поста не понравился?
Работает на ура, универсален в использовании…
Ну да ладно – дело ваше. Сдавайтесь – если слабачок. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.