-
Bonjours,
Débutant en SFML ainsi que en C++, j'ai décidé de me faire un petit jeu en 2d mais lorsque j'appuie sur Echap ou sur " Lancer le jeu " j'ai une erreur de Segmentation.
J'aimerais donc avoir un peu d'aide ;D
voici le code source :
#include <iostream>
#include <SFML/Graphics.hpp>
using namespace sf;
using namespace std;
unsigned int const LONGUEUR(1008);
unsigned int const LARGEUR(567);
int main(int argc,char** argv)
{
/**
* page de titre
*/
RenderWindow app(VideoMode(LONGUEUR,LARGEUR,32),"Tower Defence : Ecran Titre", Style::None);
/**
* ouverture de la page de titre ainsi que de la police
*
*/
Image imageTitre;
Sprite titre;
Font font;
String text;
// test ouverture de la page de titre et de la police
if(!imageTitre.LoadFromFile("titre.png"))
{
return EXIT_FAILURE;
}
if(!font.LoadFromFile("Decibel_2.ttf"))
{
return EXIT_FAILURE;
}
// Le projet c'est lancé correctement :
else
{
titre.SetImage(imageTitre);
}
// parametre du text et de l'arrier plan
text.SetText("Lancer le jeu !");
text.SetFont(font);
text.SetSize(36);
text.SetPosition(LONGUEUR/1.5,LARGEUR/1.2);
text.SetStyle(String::Regular);
titre.SetPosition(Vector2f(0,0));
// taille du texte
unsigned int largeurTexte = text.GetRect().GetWidth(); // Largeur du texte
unsigned int hauteurTexte = text.GetRect().GetHeight(); // Hauteur du texte
/**
* boucle principal de l'écran de Titre
*/
while(app.IsOpened())
{
Event event;
while(app.GetEvent(event))
{
if((event.Type == Event::MouseButtonPressed) && (event.MouseButton.Button == sf::Mouse::Left))
{
if ((event.MouseButton.X >= LONGUEUR/1.5) && (event.MouseButton.X <= (LONGUEUR/1.5 + largeurTexte)))
{
if ((event.MouseButton.Y >= LARGEUR/1.2) && (event.MouseButton.Y <= (LARGEUR/1.2 + hauteurTexte)))
{
app.Close();
}
}
}
if((event.Type == Event::KeyReleased) && (event.Key.Code == sf::Key::Escape))
{
app.Close();
}
app.Draw(titre);
app.Draw(text);
app.Display();
}
}
return EXIT_SUCCESS;
}
Merci ;)
-
C'est un bug connu lié à l'utilisation de sf::String. Tu n'y peux rien. Ou plutôt si : passer tout de suite à SFML 2. SFML 1.6 est déjà obsolète, ne commence pas ton apprentissage avec cette version.
-
A je pensais que c'étais de ma faute :-[
merci :)
-
re bonjours,
Je suis passé à la 2.0, mais j'aimerais savoir si il est encore possible de Récupérer la taille d'un texte (largeur, hauteur) comme on pouvais le faire avec la 1.6.
Comme je suis débutant j'ai encore du mal à me retrouver dans la documentation :-[
Merci
-
Bah, y a pas tant de fonctions que ça dans les classes, t'as vite fait le tour dans la doc... :P
sf::FloatRect rect = text.getGlobalBounds();
float width = rect.width;
float height = rect.height;
-
Merci,
Je refaire un tour dans la doc ^^.
-
Re,
J'ai fait les modifications et j'ai toujours le même problème que en 1.6 ???
est-ce que j'ai fait une erreur ?
Voici le code source :
#include <iostream>
#include <SFML/Graphics.hpp>
using namespace sf;
using namespace std;
unsigned int const LONGUEUR(1008);
unsigned int const LARGEUR(567);
int main(int argc,char** argv)
{
/**
* page de titre
*/
RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);
/**
* ouverture de la page de titre ainsi que de la police
*
*/
Texture imageTitre;
Font font;
Text text("Lancer le jeu !");
// test ouverture de la page de titre et de la police
if(!imageTitre.loadFromFile("titre.png"))
return EXIT_FAILURE;
Sprite titre(imageTitre);
if(!font.loadFromFile("Decibel_2.ttf"))
return EXIT_FAILURE;
// parametre du text et de l'arrier plan
text.setFont(font);
text.setCharacterSize(36);
text.setPosition(LONGUEUR/1.5,LARGEUR/1.2);
titre.setPosition(Vector2f(0,0));
// taille du texte
FloatRect rect = text.getGlobalBounds();
float largeurTexte = rect.width;
float hauteurTexte = rect.height;
/**
* boucle principal de l'écran de Titre
*/
while(app.isOpen())
{
Event event;
while(app.pollEvent(event))
{
if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
{
if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + largeurTexte)))
{
if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + hauteurTexte)))
{
app.close();
}
}
}
if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
{
app.close();
}
app.draw(titre);
app.draw(text);
app.display();
}
}
return EXIT_SUCCESS;
}
Merci de bien vouloir m'aider encore une fois ;)
PS : merci de l'aide apporter ainsi que de la vitesse de cette dernière :-*
-
Ce problème n'a été reglé que très récemment sur SFML 2, après la RC (que tu as dû prendre).
Deux solutions : soit télécharger et compiler les dernières sources de SFML, soit modifier ton code de la sorte :
Text text("Lancer le jeu !", font);
(en gros il faut toujours passer une police au constructeur de tes sf::Text)
-
Re bonjours,
J'ai fait les modifications et toujours le même problème :
La fenêtre s'ouvre mais lorsque on arrive sur :
app.close();
Le programme marque une Segmentation fault, j'ai essayer de passer en mode console et de remplacer
app.close();
par :
std::cout << "fonctionne ! " << std::endl;
Et tout à coups je n'ais plus l'erreur mais lorsque je remet app.close(); j'ai à nouveau l'erreur.
est-ce que je dois remplacer quelque chose?
Merci
-
Bon il faut savoir si oui ou non on parle bien du même bug. Lance ton debugger et montre moi la pile d'appels après le crash.
-
Re,
Je sais pas si c'est cela mais normalement ça doit être ça:
Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: D:\TowerDefence\
Adding source dir: D:\TowerDefence\
Adding file: bin\Debug\TowerDefence.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (GDB) 7.4
Child process PID: 3516
Program received signal SIGSEGV, Segmentation fault.
In ?? () ()
Debugger finished with status 0
Le programme se lance mais après ça beug je sais pas d'où ça peut venir
Merci encore :)
-
Non ce n'est pas ça. Le debugger peut donner des informations beaucoup plus approfondies, et très facilement. Je te recommande un peu de lecture sur le sujet, connaître les bases du debugger c'est crucial pour tout bon programmeur. C'est comme ça qu'on évite les "ça beug je sais pas d'où ça peut venir". Le debugger le sait, lui.
Tu devrais trouver comment afficher la pile d'appels en 2 secondes avec l'aide de Google ;)
-
Re,
Tout d'abord merci de m'avoir appris à mieux utiliser le debugger, mais ici la pile d'appels n'affiche pas la ligne où se situe le problème...
Voici la pile d'appels:
(http://nsa30.casimages.com/img/2012/08/16/120816043300324335.png) (http://www.casimages.com/img.php?i=120816043300324335.png)
J'ai aussi réussi à afficher Watches :
(http://nsa29.casimages.com/img/2012/08/16/120816044037328963.png) (http://www.casimages.com/img.php?i=120816044037328963.png)
Merci d'avance ;)
-
Bizarre. Tu compiles bien en mode Debug ?
Peux-tu nous montrer ton projet (fichier .cbp) ?
-
Re,
On peux le télécharger sur ce lien ci-dessous :
http://1ct2m6.1fichier.com/ (http://1ct2m6.1fichier.com/)
Merci
-
Je compile bien en mode débug
j'ai oublier de l'annoncé ;D
j'ai revérifier donc pas d'erreur 8)
-
Tu as des paramètres pour le mode Debug, des paramètres pour le mode Release (jusque là tout va bien), mais aussi des paramètres pour les deux, qui du coup s'ajoutent à ce que tu as déjà défini pour chaque mode. Il faut virer ces paramètres communs.
-
J'ai pas trop bien compris ce qu'il fallait faire je dois enlever les paramètre comme cela :
(http://nsa30.casimages.com/img/2012/08/16/120816071827552254.png) (http://www.casimages.com/img.php?i=120816071827552254.png)
J'ai enlever ici :
-lsfml-graphics
-lsfml-window
-lsfml-system
ainsi que SFML_DYNAMIC
mais sans resultat :'(
Merci
-
Je dirais que c'est ça oui. Par contre je m'attendrais à voir un "Debug" et un "Release" sous "TowerDefence" dans la colonne de gauche. Bref, je ne suis pas un utilisateur de Code::Blocks donc je m'arrête là dans les supositions :)
Après ces changements, toujours pas de pile d'appels en Debug ?
Vérifie aussi que tu n'as pas mélangé les deux versions de SFML, que tu n'as pas des vieux trucs qui traînent, etc. Et ce serait bien de voir la toute dernière version de ton code.
Sinon, rien à voir mais :
- pense à utiliser rect.contains et window.convertCoords (je te laisse le soin de trouver où et comment)
- tu devrais dessiner en dehors de ta boucle d'évènements
-
Re,
J'ai fait ce que tu m'as dit mais sans grand résultat mais j'ai decouvert que c'est la partie texte qui fait planter mon programme, en faite j'ai supprimer tout ce qui est en rapport avec mon texte et mon programme fonctionne mais lorsque que j'ouvre seulement le texte de cette maniere :
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
int const LONGUEUR(1008);
int const LARGEUR(567);
int main(int argc,char** argv)
{
/**
* page de titre
*/
RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);
Font font;
if(!font.loadFromFile("Decibel_2.ttf"))
{
return EXIT_FAILURE;
}
Text text("Lancer le jeu !",font);
text.setCharacterSize(36);
text.setPosition(672,472);
FloatRect rect = text.getGlobalBounds();
float largeurTexte = rect.width;
float hauteurTexte = rect.height;
while(app.isOpen())
{
Event event;
while(app.pollEvent(event))
{
if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
{
if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + 1000)))
{
if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + largeurTexte)))
{
app.close();
}
}
}
if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
{
app.close();
}
}
app.draw(text);
app.display();
}
return EXIT_SUCCESS;
}
alors le programme plante au moment de app.close();
est-ce que j'ai loupé quelque chose avec sf::Text ainsi que sf::Font ?
Merci
-
J'ai remarquer aussi que lorsque je remplace app.close(); par autre chose comme un message sur console alors le programme ne plante pas comme cela :
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
int const LONGUEUR(1008);
int const LARGEUR(567);
int main(int argc,char** argv)
{
/**
* page de titre
*/
RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);
Font font;
if(!font.loadFromFile("Decibel_2.ttf"))
{
return EXIT_FAILURE;
}
Text text("Lancer le jeu !",font);
text.setCharacterSize(36);
text.setPosition(672,472);
FloatRect rect = text.getGlobalBounds();
float largeurTexte = rect.width;
float hauteurTexte = rect.height;
while(app.isOpen())
{
Event event;
while(app.pollEvent(event))
{
if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
{
if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + hauteurTexte)))
{
if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + largeurTexte)))
{
std::cout << "message" << std::endl;
}
}
}
if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
{
app.close();
}
}
app.draw(text);
app.display();
}
return EXIT_SUCCESS;
}
et même étrangement il fonctionne très bien
alors est-ce un problème avec app.close(); et l'affichage d'un texte ?
de plus bizarrement ce programme fonctionne aussi parfaitement :
/**
*
* @author Majurian
*/
#include <iostream>
#include <SFML/Graphics.hpp>
using namespace sf;
int const LONGUEUR(1008);
int const LARGEUR(567);
int main(int argc,char** argv)
{
/**
* page de titre
*/
RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);
/**
* ouverture de la page de titre ainsi que de la police
*
*/
Texture imageTitre;
Font font;
// test ouverture de la page de titre et de la police
if(!imageTitre.loadFromFile("titre.png"))
return EXIT_FAILURE;
Sprite titre(imageTitre);
if(!font.loadFromFile("Decibel_2.ttf"))
{
return EXIT_FAILURE;
}
// parametre du text et de l'arrier plan
Text text("Lancer le jeu !",font);
text.setCharacterSize(36);
text.setPosition(LONGUEUR/1.5,LARGEUR/1.2);
titre.setPosition(0,0);
// taille du texte
FloatRect rect = text.getGlobalBounds();
float largeurTexte = rect.width;
float hauteurTexte = rect.height;
/**
* boucle principal de l'écran de Titre
*/
while(app.isOpen())
{
Event event;
while(app.pollEvent(event))
{
if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
{
if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + largeurTexte)))
{
if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + hauteurTexte)))
{
std::cout << "run" << std::endl;
}
}
}
if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
{
std::cout << "fermer" << std::endl;
}
app.draw(titre);
app.draw(text);
app.display();
}
}
return EXIT_SUCCESS;
}
j'ai enlever app.close(); et modifier par un texte afficher...
Merci
-
Ca n'a rien de bizarre, le bug survient lorsque ton application se termine (rien à voir avec app.close(), ça plante après). Donc quand tu affiches quelque chose au lieu de fermer la fenêtre, ton programme ne quitte plus, donc plus de bug.
Bon, mes souvenirs doivent être un peu embrouillés (il y a eu plusieurs variantes de ce bug sur plusieurs versions de SFML). Peut-être qu'il faut aussi lier SFML statiquement pour que ça ne crash plus.
Sinon, choppe les dernières sources de SFML et recompile la.
-
Re,
Oui tu a raison en faite lorsque on sort de la boucle principale alors le programme plante :'(
J'ai télécharger la dernière version de SFML 2.0, je n'ais pas encore compiler SFML 2.0 je vais le faire et je te dit si cela fonctionne ;)
j'ai essayer de lier SFML statiquement mais pas de changement...
Merci
-
Re bonjours,
Pardon pour le retard de ma réponse.
J'ai compiler les derniere sources comme tu me l'as dit et surprise :
J'ai réussi à faire fonctionner le programme :D
mais il y a encore un problème, il plante lorsque j'utilise le debugger :o mais lorsque je compile en mode normale il ne plante pas ???
Est-ce que je dois négliger le problème ?
Merci en tous cas ;D
-
Bonjour,
je tiens à signaler un problème similaire sous Codelite. Le SIGSEGV se lance au moment du "return 0".
voici le code utilisé :
#include <SFML/Window.hpp>
int main()
{
sf::Window window(sf::VideoMode(800, 600), "My window");
// run the program as long as the window is open
while (window.isOpen())
{
// check all the window's events that were triggered since the last iteration of the loop
sf::Event event;
while (window.pollEvent(event))
{
// "close requested" event: we close the window
if (event.type == sf::Event::Closed)
window.close();
}
}
return 0;
}
voici la pile d'appel :
0 0x76e6a334 lstrlenA
1 0x28af45f6 ??
2 0x00000100 ??
3 0x3508060f ??
4 0x74f679df wvsprintfW
5 0x0028f8d8 ??
6 0x74f67a36 wvsprintfW
7 0x3508060f ??
8 0x286981d0 ??
9 0x0028fd64 ??
10 0x1000d676 HydraDMH!HookMessages
11 0x000104cc ??
12 0x00000000 ??
Logiciels et OS :
Windows 7 x64
Codelite 4.1.5770
GDB 7.4
MinGW,gcc,g++ 4.7
En espérant que ceci puisse vous aidez à identifier le problème.
Cordialement.
-
Ca n'a rien à voir, puisque le problème précédent est lié à sf::Text.
As-tu recompilé SFML ?
-
Je croyais que ça venait de app.close(), je n'avais pas vu le lien avec sf::Text, autant pour moi.
Re bonjours,
Pardon pour le retard de ma réponse.
J'ai compiler les derniere sources comme tu me l'as dit et surprise :
J'ai réussi à faire fonctionner le programme :D
mais il y a encore un problème, il plante lorsque j'utilise le debugger :o mais lorsque je compile en mode normale il ne plante pas ???
Est-ce que je dois négliger le problème ?
Merci en tous cas ;D
Cependant, un problème semble toujours exister au niveau du debug.
As-tu recompilé SFML ?
Oui, avec les sources du GIT.
Je tiens également à préciser que j'utilise Codelite de la même façon que ce soit sous windows 7 ou Ubuntu 12.04 mais que le problème survient uniquement sous windaube.
Cordialement.
-
Bon, ça n'a peut-être plus trop rapport, mais je tiens à préciser qu'on doit effectivement avoir un dossier Debug et Release sous « TowerDefence ».
J'ignore pourquoi ces dossiers n'apparaissent pas chez lui. Selon moi, ça doit être lié à son projet en tant que tel ou une mauvaise installation/corruption des fichiers SFML.
ps. Je travaille en permanence avec Code::Blocks