Ou mettre un image pour la load en sprite ou texture dans Code::Blocks avec SFML ?
Bonjours ! Pouvez-Vous m'aider ?
Le message d'Erreur:
undefined reference to '_Imp__ZN2sf7Texture12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_4RectIiEE'
Quand je fait le code:
#pragma region includes
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <cstdlib>
#include "secondo.h"
#pragma endregion includes
#pragma region variables
sf::RenderWindow window;
sf::RectangleShape rect;
int speed = 3;
sf::Texture perso;
sf::Sprite sprite_perso;
#pragma endregion variables
#pragma region prototypes
void gestion_clavier();
#pragma endregion prototypes
int main()
{
//le message cmd.exe
std::cout << "Lancement du jeu" << std::endl;
//créer la fenêtre
sf::RenderWindow window;
//Met la fenêtre en 1200x600
window.create(sf::VideoMode(1200, 600), "Matcyborg's game");
//Modifier la position
window.setPosition(sf::Vector2i(80, 40));
//maximum de fps
window.setFramerateLimit(60);
//taille du rectangle
rect = PB_Rect(10, 10, 32, 32);
if (!perso.loadFromFile("data/images/player.png")) /*EREUR ICI AVEC LE CARRE ROUGE*/
{
std::cout << "Erreur de chargement de l'image intitulée: player.png" << std::endl;
}
perso.setSmooth(true);
sprite_perso.setTexture(perso);
//Si (while) La fenêtre est ouverte
while (window.isOpen())
{
//Création de l'event (oui juste sa)
sf::Event event;
//Test d'évènement
while (window.pollEvent(event))
{
//Si le type d'event est: "Event::Closed", quand on appuie sur la croix
if (event.type == sf::Event::Closed)
//Bah sa la ferme (parce qu'on peux faire d'autres choses)
window.close();
}
/*gestion clavier*/
gestion_clavier();
//on dessine le rectangle, l'affiche, et le met a jour
window.draw(rect);
window.draw(sprite_perso);
window.display();
window.clear();
}
//Retourne au début
return 0;
}
/*gestion clavier*/
void gestion_clavier()
{
//haut
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
rect.move(0, -speed);
}
//bas
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
rect.move(0, speed);
}
//gauche
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
rect.move(-speed, 0);
}
//droit
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
rect.move(speed, 0);
}
}
Et l'arrière [.h] (au cas ou)
#include <SFML/Graphics.hpp>
//fonction crée un rectangle
sf::RectangleShape PB_Rect(int posX, int posY, int width, int height)
{
sf::RectangleShape rect(sf::Vector2f(width, height));
rect.setPosition(posX, posY);
rect.setFillColor(sf::Color(255, 0, 0, 255));
return rect;
}
J'ai cherché partout sur le web... pendant 3 jours... Mais apparemment personne n'as jamais eu ce problème !
Merci d'avance !!!
- Edité par MathiasLoliter 3 février 2018 à 13:44:35
Cela veut dire que lorsque que tu as donné le chemin des dll de SFML tu as pu te tromper. Pour info il ne faut pas utiliser le projet prédéfini code::blocks pour SFML il semble ne pas marcher. Pour être sur de réussir utlise le tuto sur SFML.
- Edité par Vildevil 3 février 2018 à 14:10:21
Les forums sont des Dolipranes, il faut savoir les utiliser au bon moment.
Depuis SFML 2.2, lors d'une liaison statique, il faut aussi lier toutes les dépendances de SFML. Par exemple: si vous liez à sfml-window-s ou sfml-window-s-d sur Windows, il faudra aussi lier à winmm, gdi32 et opengl32. Parfois ces bibliothèques seront listées sous "Inherited values" mais les ajouter une fois de plus ne devrait pas poser de problème.
Je pense que tout est a cause de sa (et je n'ai pas "SFML_STATIC" dans "#define")
Mais... Ces explications sont très très très vague pour moi...
Pourriez-Vous m'aider ? Comment fait-on pour l'avoir ? Car les exemples, c'est bien, mais bon...
J'ai cherché dans les topics, les derniers (je pense) sont en dessous de SFML 2.2...
HELP
merci - matcyborg
- Edité par MathiasLoliter 3 février 2018 à 15:03:08
C'est quoi "Compiler des lib" et Comment fait-on ? J'ai (encore, sans sa, plus de question :)) cherché sur google (ou duckduckgo pour les Brm#/*_\:!5rmm) et je trouve directement comment installer SFML donc...
PS: Et est-ce obligé que le problème vienne de la ?
Merci encore, j'avance, vous m'aidez beaucoup - Sans ironie - matcyborg
- Edité par MathiasLoliter 3 février 2018 à 23:18:49
En fait quand je dis compiler les libs c'est que tu compile toi même SFLM à partir du code source (le tuto) pour ton compilateur. Etant donné que tu utilises CodeBlocks tu as du choisir parmi les versions suivantes lors du téléchargement :
Laquelle as-tu choisi ? Il faut faire attention car les compilateurs GCC ne réagissent pas toujours de la même façon ce qui peut entrainer des conflits, il faut donc prendre la même version que ton compilateur.
Juste comme ça, quand j'utilisais SFML pour un petit jeu je codais sur Visual Studio 2012 et ça marchais nickel, tu devrais peut être essayer en plus l'interface est plutôt sympa et agréable.
- Edité par Vildevil 3 février 2018 à 23:38:02
Les forums sont des Dolipranes, il faut savoir les utiliser au bon moment.
Ces types de problèmes sont souvent liés au fait que tu utilises une version de SFML non compatible avec ton compilteur. Ou un problème de linkage.
Ici pour Code::Blocks, on a 4 versions téléchargeable possible :
GCC 4.9.2 TDM (SJLJ) - 32-bit
GCC 6.1.0 MinGW (DW2) - 32-bit
GCC 4.9.2 TDM (SJLJ) - 64-bit
GCC 6.1.0 MinGW (SEH) - 64-bit
Étant donné, qu'il est conseillé d'utiliser les versions 32-bit, le choix est donc limité aux 2 premières versions. Vérifie que c'est bien l'une des 2 et que celle-ci soit compatible avec la version du compilateur utilisée par Code::Blocks.
Maintenant pour le problème de linkage tout dépend si tu souhaites link en version dynamique ou statique. Si c'est en static il faut impérativement inclure les dépendances dans le linker, comme indiqué dans la doc. (et bien faire attention aux extensions -s et -d, c'est souvent une source d'erreur).
Et si tu n'y arrives pas, ba continue d'essayer, en relisant la doc encore et encore, c'est comme ça que j'ai procédé la première fois perso .
Pour "Wiliam", moi j'ai pris (par tuto) GCC 4.9.2 TDM (SJLJ)-32-bit et j'ai le Compiler (que j'ai téléchargé) TDM-GCC-32 (grace au site SFML car avant de l'installer code::blocks de générait rien a cause de "vous n'avez pas de compiler")
Après sa marchait donc avec la TDM-GCC-32, la j'ai téléchargé GCC 4.9.2 TDM (SJLJ)-32-bit (SFML), j'ai trouvé un tutoriel génial en anglais qui expliquait tout et qui, figurez vous, était le seul tutoriel youtube qui marchait pour moi (1 jour sur youtube je m'en souviens).
J'ai donc tout linké ( |(plus bas)| ). Tout marchait merveilleusement bien, et LA, je fais tranquillement mes test, et voila qu'est survenu mon probleme de "loadFromFiles("player.png"); ! Vouala mon ystoare !
PS:
-Sa change quoi dynamique ou statique ? Si les deux m'aident a faire charger mon image dans mon code ! Je prend les deux !
-Et j'ai essayé visual studio express, et j'ai fui direct, je pensait que se serait plus simple code::blocks... Mais au point ou j'en suis...
- Edité par MathiasLoliter 4 février 2018 à 0:17:55
Le problème de loadFromFile arrive souvent normalement si tu lances le programmes depuis l’exécutable du dossier (en mettant tous les dll nécessaires) cela devrait marcher, j'avais le même problème.
Les forums sont des Dolipranes, il faut savoir les utiliser au bon moment.
mais svp envoyer moi tout ce qu'il faut je suis à bout, j'ai désinstallé code::blocks et quand je le réinstalle, SFML veut plus, je désintalle SFML, et quand je le réinstalle, code::blocks veut plus...
SVP envoyer moi ce qu'il faut télécharger... Je connais les manip par cœur maintenant mais il me faut SFML, et Code::Blocks
- Edité par MathiasLoliter 7 février 2018 à 14:29:32
Bon, sentant toute cette détresse émanée de ton post, j'ai testé de mon côté en installant la dernière version de Code::Blocks (17.12)(mingw). Et visiblement, il y a un souci de compatibilité entre les versions de SFML proposées et la version de MinGW (gcc 5.1.0) fournie par Code::Blocks par default. Je me suis heurté à plusieurs problèmes de linkage.
Pour régler le souci, j'ai installé la dernière version de MinGW disponible sur le site officiel.
Ce que je te propose, c'est de repartir sur une installation clean de tout ce bazarre, étape par étape.
Avant de réinstaller Code::Blocks, on va installer la dernière version de MinGW.
INSTALLATION DE MINGW
--------------------------------------------
Direction le site http://www.mingw.org/, dans la colonne de gauche clique sur "Download"
De là, tu tombes sur une page sourceForge, clique sur le dossier "Installer"
Ensuite, télécharge "mingw-get-setup.exe"
Une fois téléchargé, lance le et clique sur "Install".
Un chemin d'installation te sera demandé, il est très fortement conseillé de laisser le chemin d'installation par defaut : C:\MinGW
Pour le reste, tu peux laisser les cases cochées par defaut.
Une fois fait -> CONTINUE
Apparaît ensuite une fenêtre proposant des packages à installer. Ici on va en installer 2, tu peux cocher :
mingw32-base
mingw32-gcc-g++
(Au passage tu peux voir la version fournie de gcc -> 6.3.0)
Une fois ces 2 cases cochées, clique en haut à gauche sur Installation -> Apply Changes -> Apply
L'installation des packages se lance, plus qu'à attendre un peu. Une fois terminé, si tout s'est bien passé, les cases précédemments cochées devraient être verte, ensuite on peut fermer la fenêtre.
Direction http://www.codeblocks.org/downloads/26, choisis ensuite la version "codeblocks-17.12mingw-setup.exe" (ici j'ai pris la version livré avec mingw intégré, histoire d'avoir un compilo de base quand même).
Lance ensuite l'installation, il te demandera ce que tu veux installer, sélectionne TOUT.
Une fois l'installation finie, tu peux lancer Code::Blocks.
À son premier lancement, il procèdera à une auto-detection du compilateur et si tout se passe bien il indique que le compilateur utilisé par défaut est GNU GCC, clique ensuite sur OK.
Une fois dans Code::Blocks -> crée un nouveau projet -> projet vide
Dans l'assistant il faudra ensuite sélectionner les 2 configs DEBUG et RELEASE.
Maintenant que le projet est créé, on va configurer le compilateur en indiquant son chemin, pour ça, clique sur le menu Settings -> Compiler...
Une fois dedans : Onglet "Toolchain executables" et tu changes le chemin d'installation par : C:\MinGW
Au passage, dans l'onglet "Compiler Flags", tu peux cocher [-std=c++1z](aka C++17) si ce n'est pas déjà fait ainsi que [-Wall] et [-Wextra] pour les Warnings, en sachant qu'on peut en ajouter beaucoup d'autres, mais ceci est un autre sujet ^^.
Tu peux valider.
À partir de là si tu le souhaites, pour t'assurer que le compilateur soit bien configuré, tu peux créer un fichier main.cpp type "Hello World", histoire d'être sûr qu'il soit bien en place.
Si tu as testé et que tu as vu "Hello World" s'afficher, je te félicite ^^. On va pouvoir passer à l'étape suivante : la configuration du projet SFML.
Donc pour commencer, il va nous falloir la bonne version pré-compilée de SFML qui sera compatible avec notre version de gcc 6.3.0. Bon sur le site on ne trouve pas directement de version pré-compilé compatible avec gcc6.3.0 mais la version 6.1.0 l'est.
Une fois téléchargé, extrait le tout dans un coin bien rangé.
Ensuite pour le linkage, j'ai une préférence pour la méthode STATIC. L'avantage c'est que tu n'as pas besoin de t'embêter à copier les .dll, tout est automatiquement inclu dans l'executable à la compilation. Du coup j'utiliserai cette méthode, après bien sûr libre à toi de choisir ;).
On passe donc à la configuration du projet. Pour ce faire, retour sur le projet précédemment crée sur Code::Blocks (ou un nouveau peu importe), puis menu Project -> Build options
Dans la config GLOBAL du projet:
Onglet Compiler settings -> Onglet #defines -> écrit SFML_STATIC
(Bon j'imagine que ce n'est pas la peine de préciser que dans l'onglet Search Directories, les chemins à indiquer sont censés correspondre au dossier précédemment extrait de notre version de SFML ;).
Dans la config DEBUG du projet:
Onglet Linker settings -> ajoute
sfml-graphics-s-d
sfml-window-s-d
sfml-system-s-d
opengl32
freetype
jpeg
winmm
gdi32
Dans la config RELEASE du projet:
Onglet Linker settings -> ajoute
sfml-graphics-s
sfml-window-s
sfml-system-s
opengl32
freetype
jpeg
winmm
gdi32
Pour être sûr, avant de compiler ton projet, tu peux faire un clean (clic droit sur ton projet -> Clean) et rebuild le projet (clic droit sur ton projet -> Rebuild).
Ça y est ! En principe, à partir de là, tu pourras compiler ton projet SFML. Et si ça ne fonctionne pas, ba réessaie :).
Arf merci bien tu me sauve je met cette page en favori au cas ou
Guit0Xx a écrit:
Bonsoir,
Bon, sentant toute cette détresse émanée de ton post, j'ai testé de mon côté en installant la dernière version de Code::Blocks (17.12)(mingw). Et visiblement, il y a un souci de compatibilité entre les versions de SFML proposées et la version de MinGW (gcc 5.1.0) fournie par Code::Blocks par default. Je me suis heurté à plusieurs problèmes de linkage.
Pour régler le souci, j'ai installé la dernière version de MinGW disponible sur le site officiel.
Ce que je te propose, c'est de repartir sur une installation clean de tout ce bazarre, étape par étape.
Avant de réinstaller Code::Blocks, on va installer la dernière version de MinGW.
INSTALLATION DE MINGW
--------------------------------------------
Direction le site http://www.mingw.org/, dans la colonne de gauche clique sur "Download"
De là, tu tombes sur une page sourceForge, clique sur le dossier "Installer"
Ensuite, télécharge "mingw-get-setup.exe"
Une fois téléchargé, lance le et clique sur "Install".
Un chemin d'installation te sera demandé, il est très fortement conseillé de laisser le chemin d'installation par defaut : C:\MinGW
Pour le reste, tu peux laisser les cases cochées par defaut.
Une fois fait -> CONTINUE
Apparaît ensuite une fenêtre proposant des packages à installer. Ici on va en installer 2, tu peux cocher :
mingw32-base
mingw32-gcc-g++
(Au passage tu peux voir la version fournie de gcc -> 6.3.0)
Une fois ces 2 cases cochées, clique en haut à gauche sur Installation -> Apply Changes -> Apply
L'installation des packages se lance, plus qu'à attendre un peu. Une fois terminé, si tout s'est bien passé, les cases précédemments cochées devraient être verte, ensuite on peut fermer la fenêtre.
Direction http://www.codeblocks.org/downloads/26, choisis ensuite la version "codeblocks-17.12mingw-setup.exe" (ici j'ai pris la version livré avec mingw intégré, histoire d'avoir un compilo de base quand même).
Lance ensuite l'installation, il te demandera ce que tu veux installer, sélectionne TOUT.
Une fois l'installation finie, tu peux lancer Code::Blocks.
À son premier lancement, il procèdera à une auto-detection du compilateur et si tout se passe bien il indique que le compilateur utilisé par défaut est GNU GCC, clique ensuite sur OK.
Une fois dans Code::Blocks -> crée un nouveau projet -> projet vide
Dans l'assistant il faudra ensuite sélectionner les 2 configs DEBUG et RELEASE.
Maintenant que le projet est créé, on va configurer le compilateur en indiquant son chemin, pour ça, clique sur le menu Settings -> Compiler...
Une fois dedans : Onglet "Toolchain executables" et tu changes le chemin d'installation par : C:\MinGW
Au passage, dans l'onglet "Compiler Flags", tu peux cocher [-std=c++1z](aka C++17) si ce n'est pas déjà fait ainsi que [-Wall] et [-Wextra] pour les Warnings, en sachant qu'on peut en ajouter beaucoup d'autres, mais ceci est un autre sujet ^^.
Tu peux valider.
À partir de là si tu le souhaites, pour t'assurer que le compilateur soit bien configuré, tu peux créer un fichier main.cpp type "Hello World", histoire d'être sûr qu'il soit bien en place.
Si tu as testé et que tu as vu "Hello World" s'afficher, je te félicite ^^. On va pouvoir passer à l'étape suivante : la configuration du projet SFML.
Donc pour commencer, il va nous falloir la bonne version pré-compilée de SFML qui sera compatible avec notre version de gcc 6.3.0. Bon sur le site on ne trouve pas directement de version pré-compilé compatible avec gcc6.3.0 mais la version 6.1.0 l'est.
Une fois téléchargé, extrait le tout dans un coin bien rangé.
Ensuite pour le linkage, j'ai une préférence pour la méthode STATIC. L'avantage c'est que tu n'as pas besoin de t'embêter à copier les .dll, tout est automatiquement inclu dans l'executable à la compilation. Du coup j'utiliserai cette méthode, après bien sûr libre à toi de choisir ;).
On passe donc à la configuration du projet. Pour ce faire, retour sur le projet précédemment crée sur Code::Blocks (ou un nouveau peu importe), puis menu Project -> Build options
Dans la config GLOBAL du projet:
Onglet Compiler settings -> Onglet #defines -> écrit SFML_STATIC
(Bon j'imagine que ce n'est pas la peine de préciser que dans l'onglet Search Directories, les chemins à indiquer sont censés correspondre au dossier précédemment extrait de notre version de SFML ;).
Dans la config DEBUG du projet:
Onglet Linker settings -> ajoute
sfml-graphics-s-d
sfml-window-s-d
sfml-system-s-d
opengl32
freetype
jpeg
winmm
gdi32
Dans la config RELEASE du projet:
Onglet Linker settings -> ajoute
sfml-graphics-s
sfml-window-s
sfml-system-s
opengl32
freetype
jpeg
winmm
gdi32
Pour être sûr, avant de compiler ton projet, tu peux faire un clean (clic droit sur ton projet -> Clean) et rebuild le projet (clic droit sur ton projet -> Rebuild).
Ça y est ! En principe, à partir de là, tu pourras compiler ton projet SFML. Et si ça ne fonctionne pas, ba réessaie :).
Par contre depuis que la version SFML 2.5 est sortie, la partie du tuto concernant MinGW n'est plus valide, enfin en admettant qu'on veuille utiliser la version 2.5 bien sûr . Si c'est le cas, il faut télécharger la version de MinGW proposée sur la page de téléchargement de la SFML. Ici :
Une fois téléchargé, extraire le tout. Ensuite, perso j'ai copié-collé le dossier mingw32 à la racine du DD, histoire d'avoir un chemin facile à indiquer au compilateur.
Pour finir au niveau de la config du compilo, on indique le chemin du dossier de notre version de MinGW préalablement téléchargée ainsi que les paramètres, qui ne sont ni plus ni moins que les exécutables utilisés pour la compilation (si mes souvenirs sont bons, par défault en principe il y a "mingw-" devant, mais pour le coup il faut le virer ce préfixe), ce qui donne :
Et voilà, si jamais ça peut servir pour ceux qui veulent passer à la version 2.5.
Pour le reste du tuto, c'est strictement la même chose.
Blanc sans N ça fait blac, comme quoi sans haine on est tous égaux.
...
...
...
...
...