J'ai choisi SFML 2.3.2 sur Linux Mint 18.1 en utilisant C++ 17 pour apprendre à travailler avec des interfaces graphiques. Comme deuxième projet après Hello World, j'essaye de reproduire Snake, ce jeu de vieux téléphones avait pré-installé. La plupart des choses ont fonctionné jusqu'à maintenant, avec quelques exceptions mineures que je devrai faire face plus tard, certaines causées par le jeu n'étant pas encore complètement fini. Juste pour être sûr que je comprends bien le problème, car je n'ai jamais travaillé avec des interfaces graphiques et des images dans un langage de niveau inférieur avant. D'abord vous chargez votre image dans la texture, puis vous ajoutez la texture à un sprite, puis vous dessinez ce sprite sur la fenêtre?Images non affichées à l'aide de sprites dans SFML
Le programme compile parfaitement, initialise tout correctement et s'exécute sans problème majeur inexpliqué. Sauf que les images ne montrent pas. Les sprites sont présents et affichés dans leur couleur de fond mono-chrome par défaut, mais ne montrent aucune image.
Qu'est-ce que je fais de mal, et comment puis-je le réparer? Merci!
// HEADERS
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Color.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Image.hpp>
#include <SFML/Graphics/Rect.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/Graphics/Texture.hpp>
#include <SFML/System/String.hpp>
#include <SFML/Window/Keyboard.hpp>
// CREATE NEW FONT
sf::Font create_font()
{
sf::Font f;
bool id = f.loadFromFile("/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf");
if (id == false)
{
std::cerr << "Font:\tCould not be loaded." << std::endl;
}
else
{
std::cerr << "Font:\tLoaded successfully." << std::endl;
}
return f;
}
// CREATE NEW SPRITE USING TEXTURE, GIVEN ARE PATH WITH COORDINATES AND DIMENSIONS
sf::Sprite load_img(std::string path, long x, long y, long w, long h)
{
sf::Texture t;
bool id = t.loadFromFile(path);
if (id == false)
{
std::cerr << "Texture:\t" << path << "\tFailed to load." << std::endl;
}
else
{
std::cerr << "Texture:\t" << path << "\tLoaded successfully." << std::endl;
}
sf::Sprite s(t);
s.setTextureRect(sf::IntRect((int)x, (int)y, (int)w, (int)h));
s.setPosition(x, y);
return s;
}
// MAIN FUNCTION
int main()
{
// DECLARING/DEFINING VARIABLES
unsigned long window_width = 512;
unsigned long window_height = 512;
unsigned long score = 0;
unsigned long head_old_position_x, head_old_position_y;
std::string title = "Snek";
std::string wdir = "/home/kate/Documents/coding/snek/";
// WINDOW
sf::RenderWindow window(sf::VideoMode(window_width, window_height), title);
window.setFramerateLimit(60);
// SPRITES
sf::Sprite background = load_img(wdir + "img/background.png", 0, 0, 512, 512);
sf::Sprite head = load_img(wdir + "img/head.png", 47, 39, 8, 8);
sf::Sprite body = load_img(wdir + "img/body.png", 39, 39, 8, 8);
sf::Sprite poison = load_img(wdir + "img/poison.png", 119, 119, 8, 8);
sf::Sprite trap = load_img(wdir + "img/trap.png", 159, 159, 8, 8);
sf::Sprite candy = load_img(wdir + "img/candy.png", 199, 199, 8, 8);
// FONT
sf::Font font = create_font();
// TEXT
sf::Text score_display(title, font, 20);
sc// HEADERS
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Color.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Image.hpp>
#include <SFML/Graphics/Rect.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/Graphics/Texture.hpp>
#include <SFML/System/String.hpp>
#include <SFML/Window/Keyboard.hpp>
// CREATE NEW FONT
sf::Font create_font()
{
sf::Font f;
bool id = f.loadFromFile("/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf");
if (id == false)
{
std::cerr << "Font:\tCould not be loaded." << std::endl;
}
else
{
std::cerr << "Font:\tLoaded successfully." << std::endl;
}
return f;
}
// CREATE NEW SPRITE USING TEXTURE, GIVEN ARE PATH WITH COORDINATES AND DIMENSIONS
sf::Sprite load_img(std::string path, long x, long y, long w, long h)
{
sf::Texture t;
bool id = t.loadFromFile(path);
if (id == false)
{
std::cerr << "Texture:\t" << path << "\tFailed to load." << std::endl;
}
else
{
std::cerr << "Texture:\t" << path << "\tLoaded successfully." << std::endl;
}
sf::Sprite s(t);
s.setTextureRect(sf::IntRect((int)x, (int)y, (int)w, (int)h));
s.setPosition(x, y);
return s;
}
// MAIN FUNCTION
int main()
{
// DECLARING/DEFINING VARIABLES
unsigned long window_width = 512;
unsigned long window_height = 512;
unsigned long score = 0;
unsigned long head_old_position_x, head_old_position_y;
std::string title = "Snek";
std::string wdir = "/home/kate/Documents/coding/snek/";
// WINDOW
sf::RenderWindow window(sf::VideoMode(window_width, window_height), title);
window.setFramerateLimit(60);
// SPRITES
sf::Sprite background = load_img(wdir + "/img/background.png", 0, 0, 512, 512);
sf::Sprite head = load_img(wdir + "/img/head.png", 47, 39, 8, 8);
sf::Sprite body = load_img(wdir + "/img/body.png", 39, 39, 8, 8);
sf::Sprite poison = load_img(wdir + "/img/poison.png", 119, 119, 8, 8);
sf::Sprite trap = load_img(wdir + "/img/trap.png", 159, 159, 8, 8);
sf::Sprite candy = load_img(wdir + "/img/candy.png", 199, 199, 8, 8);
// FONT
sf::Font font = create_font();
// TEXT
sf::Text score_display(title, font, 20);
score_display.setString(std::to_string(score));
score_display.setPosition(5, 5);
// LOOP
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{ window.close(); }
head_old_position_x = head.getPosition().x;
head_old_position_y = head.getPosition().y;
// MOVEMENT BASED ON KEYBOARD INPUT
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
head.setPosition(head.getPosition().x - 8, head.getPosition().y);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
head.setPosition(head.getPosition().x, head.getPosition().y - 8);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
head.setPosition(head.getPosition().x + 8, head.getPosition().y);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
head.setPosition(head.getPosition().x, head.getPosition().y + 8);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (body.getPosition().x == candy.getPosition().x && body.getPosition().y == candy.getPosition().y)
{
score ++;
score_display.setString(std::to_string(score));
}
// REFRESH WINDOW
window.clear();
window.draw(background);
window.draw(head);
window.draw(body);
window.draw(poison);
window.draw(trap);
window.draw(candy);
window.draw(score_display);
window.display();
}
}
return 0;
}
ore_display.setString(std::to_string(score));
score_display.setPosition(5, 5);
// LOOP
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{ window.close(); }
head_old_position_x = head.getPosition().x;
head_old_position_y = head.getPosition().y;
// MOVEMENT BASED ON KEYBOARD INPUT
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
head.setPosition(head.getPosition().x - 8, head.getPosition().y);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
head.setPosition(head.getPosition().x, head.getPosition().y - 8);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
head.setPosition(head.getPosition().x + 8, head.getPosition().y);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
head.setPosition(head.getPosition().x, head.getPosition().y + 8);
body.setPosition(head_old_position_x, head_old_position_y);
}
if (body.getPosition().x == candy.getPosition().x && body.getPosition().y == candy.getPosition().y)
{
score ++;
score_display.setString(std::to_string(score));
}
// REFRESH WINDOW
window.clear();
window.draw(background);
window.draw(head);
window.draw(body);
window.draw(poison);
window.draw(trap);
window.draw(candy);
window.draw(score_display);
window.display();
}
}
return 0;
}
Y a-t-il des messages dans la console? –
Les raisons habituelles pour les images non affichées sont les suivantes: la texture est hors de portée ou n'a pas pu être chargée. –
@ArnavBorborah Non, il n'y a rien de l'une des fonctions SFML. Ma propre vérification d'erreur confirme que tout * aurait * fonctionné comme prévu. – Katembers