Bonjours ,
Bon mon titre n'est pas très explicite mais je ne savais pas quoi écrire,
donc voici mon prob : quand je compile tous ce charge bien mais arrivé a l'ouverture de la fenétre sa plante, j'ai réussi à découvrir d'où vient l'erreur
gui::IGUIButton *bouton = gui->addButton(
core::rect<s32>(220,15,300,30), 0, -1, message);
Merci d'avance
Hors ligne
Y a pas assez d'infos pour qu'on puisse t'aider : il faut que tu nous montre plus de code.
A mon avis, t'as du oublier d'initialiser un pointeur, le gui ou le message sans doute, mais je peux pas en être sur sans le code.
Dernière modification par Perceval (21-10-2007 09:58:53)
Hors ligne
ok voici mon code
#include <irr/irrlicht.h> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <winsock.h> #include <MYSQL/mysql.h> #include <string> using namespace std; using namespace irr; //------------------------------------------------------------------------------- //--------------------------------------------------------------------------------- int main(void) { //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //Déclaration du pointeur de structure de type MYSQL MYSQL mysql; //Initialisation de MySQL mysql_init(&mysql); //Options de connexion mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option"); //Si la connexion réussie... if(mysql_real_connect(&mysql,"serveur-de-la-chaussee.no-ip.info","bestben","19920512","mmo",0,NULL,0)) { //Requête qui sélectionne tout dans ma table scores mysql_query(&mysql, "SELECT * FROM perso"); //Déclaration des pointeurs de structure MYSQL_RES *result = NULL; MYSQL_ROW row = NULL; unsigned int i = 0; unsigned int num_champs = 0; //On met le jeu de résultat dans le pointeur result result = mysql_store_result(&mysql); //On choisie une ligne mysql_data_seek(result, 1); //On récupère le nombre de champs num_champs = mysql_num_fields(result); //on stock les valeurs de la ligne choisie row = mysql_fetch_row(result); //On déclare un pointeur long non signé pour y stocker la taille des valeurs unsigned long *lengths; //On stocke cette taille dans le pointeur lengths = mysql_fetch_lengths(result); //On fait une boucle pour avoir la valeur de chaque champs for(i = 0; i < num_champs; i++) { //On ecrit toutes les valeurs printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL"); } //Libération du jeu de résultat mysql_free_result(result); //Fermeture de MySQL mysql_close(&mysql); printf("\n"); } else //Sinon ... { printf("Une erreur s'est produite lors de la connexion à la BDD!"); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 16,false,false,false); video::IVideoDriver* driver = device->getVideoDriver (); scene::ISceneManager* scenegraph = device->getSceneManager (); scene::ISceneManager* smgr = device->getSceneManager(); //On récupère un pointeur vers la gui. gui::IGUIEnvironment *gui = scenegraph->getGUIEnvironment(); //On rend invisible le curseur device->getCursorControl ()-> setVisible (false); SKeyMap keyMap[5]; //avancer keyMap[0].Action = irr::EKA_MOVE_FORWARD; keyMap[0].KeyCode = irr::KEY_KEY_Z; //reculer keyMap[1].Action = irr::EKA_MOVE_BACKWARD; keyMap[1].KeyCode = irr::KEY_KEY_S; //a gauche keyMap[2].Action = irr::EKA_STRAFE_LEFT; keyMap[2].KeyCode = irr::KEY_KEY_Q; //a droite keyMap[3].Action = irr::EKA_STRAFE_RIGHT; keyMap[3].KeyCode = irr::KEY_KEY_D; //saut keyMap[4].Action = irr::EKA_JUMP_UP; keyMap[4].KeyCode = irr::KEY_SPACE; scene::IAnimatedMesh *room = scenegraph->getMesh("essai.3ds"); if (room == 0) { std::cout << "problème de chargement de la salle" << std::endl; return 1; } scene::ImeshSceneNode *Nroom = scenegraph->addMeshSceneNode(room->getMesh(0)); Nroom->setPosition(core::vector3df(0,0,0)); //On applique une texture à la salle. scenegraph->getMeshManipulator()->makePlanarTextureMapping( room->getMesh(0), 0.004f); Nroom->setMaterialTexture( 0, driver->getTexture("rockwall.bmp") ); scene::ITriangleSelector* selector = 0; //et tu lui associ le node : selector = smgr->createOctTreeTriangleSelector(room->getMesh(0), Nroom, 128); Nroom->setTriangleSelector(selector); selector->drop(); //tu cree la cam : scene::ICameraSceneNode *camera = scenegraph->addCameraSceneNodeFPS (0, 500.0f, 300.0f, 0, keyMap, 5, false); camera->setPosition(core::vector3df(0,15,0)); //puis tu lui associ la collision avec comme surface "selector" : scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( selector, camera, core::vector3df(50,50,50), core::vector3df(0,-1,0), core::vector3df(0,6,0)); camera->addAnimator(anim); anim->drop(); //lumiere scene::ILightSceneNode* lum1 = scenegraph->addLightSceneNode(Nroom, core::vector3df(0,1,0),video::SColorf(0.9f, 0.9f, 1.0f, 1.0f), 100.0f); scene::ILightSceneNode* lum2 = scenegraph->addLightSceneNode(Nroom, core::vector3df(10,1,0),video::SColorf(0.9f, 0.9f, 1.0f, 1.0f), 100.0f); scene::ILightSceneNode* lum3 = scenegraph->addLightSceneNode(Nroom, core::vector3df(20,1,0),video::SColorf(0.9f, 0.9f, 1.0f, 1.0f), 100.0f); scene::ILightSceneNode* lum4 = scenegraph->addLightSceneNode(camera, core::vector3df(0,0,2),video::SColorf(0.9f, 0.9f, 1.0f, 1.0f), 200.0f); //arme scene::IAnimatedMesh* arme = scenegraph->getMesh("armeV2.obj"); scene::IAnimatedMeshSceneNode* Narme = scenegraph->addAnimatedMeshSceneNode(arme); //position arme Narme->setParent(camera); Narme->setPosition(core::vector3df(2,-3,5)); // relatif à la position de la caméra //On modifie les propriétés de l'arme Narme->setMaterialFlag(video::EMF_LIGHTING, true); Narme->setMaterialFlag(video::EMF_FOG_ENABLE, true); Narme->getMaterial(0).EmissiveColor = video::SColor(255,0,0,0); //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //On affecte une nouvelle police par défaut. gui->getSkin()->setFont(gui->getFont("fontLucida.png")); //On crée une chaîne de caractères unicode pour pouvoir y mettre des accents. wchar_t* message(L"Le probleme est resolu"); //On ajoute un joli texte, avec bordure, fond et retour à la ligne automatique. gui::IGUIStaticText *texte = gui->addStaticText(message, core::rect<s32>(20,30,300,140), true, true, 0, -1, true); //La zone de texte, dans le coin supérieur gauche. gui::IGUIEditBox *editBox = gui->addEditBox(message, core::rect<s32>(20,15,200,30)); //On réutilise la même chaîne de caractères pour le texte du bouton. swprintf(message, L"Mise a jour", 224); //On rajoute le bouton de mise à jour dans le coin supérieur droit. gui::IGUIButton *bouton = gui->addButton( core::rect<s32>(220,15,300,30), 0, -1, message); //On associe des images de fond aux états du bouton. bouton->setImage(driver->getTexture("vert.bmp")); bouton->setPressedImage(driver->getTexture("rouge.bmp")); //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ driver->setFog(video::SColor(0,215,215,224), false, 2.0,200.0,0.01, true); //La boucle de rendu while (device->run()) { driver->beginScene(true,true,video::SColor(0,200,200,200)); scenegraph->drawAll (); gui->drawAll(); driver->endScene (); //Si le bouton est enfoncé, le texte de la zone de texte //devient le nouveau texte du texte satique. if (bouton->isPressed() == true) texte->setText(editBox->getText()); } device->drop (); return 0; }
Bon je sait le code est pas très propre :p
Et l'erreur est de type fenétre windows envoyer ne pas envoyer
Hors ligne
Je sais pas si ton erreur vient de là ou pas, mais çà :
wchar_t* message(L"Le probleme est resolu");
c'est bien quand on fait du C, mais je trouve pas çà très bien pour du C++.
Il y a une classe dans Irrlicht pour gérer les chaînes de caractères (strinw), certainement plus simple à utiliser que swprintf.
Hors ligne
OUi j'avais a l'origine essayer avec stringw Mais j'était tombé sur ça:
node.cpp:177: error: no matching function for call to `irr::gui::IGUIEnvironment::addStaticText(irr::core::stringw&, irr::core::rect<irr::s32>, bool, bool, int, int, bool)' C:/Program Files/CodeBlocks/include/IRR/IGUIEnvironment.h:282: note: candidates are: virtual irr::gui::IGUIStaticText* irr::gui::IGUIEnvironment::addStaticText(const wchar_t*, const irr::core::rect<irr::s32>&, bool, bool, irr::gui::IGUIElement*, irr::s32, bool) node.cpp:181: error: no matching function for call to `irr::gui::IGUIEnvironment::addEditBox(irr::core::stringw&, irr::core::rect<irr::s32>)' C:/Program Files/CodeBlocks/include/IRR/IGUIEnvironment.h:298: note: candidates are: virtual irr::gui::IGUIEditBox* irr::gui::IGUIEnvironment::addEditBox(const wchar_t*, const irr::core::rect<irr::s32>&, bool, irr::gui::IGUIElement*, irr::s32) node.cpp:184: error: cannot convert `irr::core::stringw' to `wchar_t*' for argument `1' to `int swprintf(wchar_t*, const wchar_t*, ...)' node.cpp:188: error: no matching function for call to `irr::gui::IGUIEnvironment::addButton(irr::core::rect<irr::s32>, int, int, irr::core::stringw&)' C:/Program Files/CodeBlocks/include/IRR/IGUIEnvironment.h:165: note: candidates are: virtual irr::gui::IGUIButton* irr::gui::IGUIEnvironment::addButton(const irr::core::rect<irr::s32>&, irr::gui::IGUIElement*, irr::s32, const wchar_t*, const wchar_t*)
Hors ligne
Je pense que tu passais directement le stringw dans tes fonctions : en fait, il faut appeler le méthode c_str() de ton objet stringw, qui rend une chaîne de caractère
Hors ligne
J'ai pas trop compris ta dernière phrase :
appeler la méthode c_str() de ton objet stringw
Hors ligne
Je suppose que t'as déclaré un objet stringw quelque part dans ton code :
stringw str = L"Ceci est un objet stringw";
Quand je parles d'appeler sa méthode c_str(), je veux dire écrire çà :
str.c_str();
qui va te rendre un wchar_t*
Hors ligne
Non, en fait je vois çà :
// tu créés un objet stringw ici core::stringw message = L"Ceci est un objet stringw"; // dans tes appels, tu changes message par message.c_str() gui::IGUIStaticText *texte = gui->addStaticText(message.c_str(), core::rect<s32>(20,30,300,140), true, true, 0, -1, true); // après, si tu veux changer de messages tu fais çà message = L"nouveau message"; // de cette façon, tu es sur que la mémoire allouée à ton ancienne chaîne est libérée, // ce dont je ne suis pas certain avec swprintf
Hors ligne
Ok ça c'est bon mais arriver à cette ligne
swprintf(message.c_str(), L"Mise a jour", 224);
un message d'erreur s'affiche
node.cpp:183: error: invalid conversion from `const wchar_t*' to `wchar_t*' node.cpp:183: error: initializing argument 1 of `int swprintf(wchar_t*, const wchar_t*, ...)'
Tu m'a dit de passer par stringw a la place de swprintf mais comment on fait
Dernière modification par bestben (21-10-2007 11:40:27)
Hors ligne
T'as plus besoin des swprintf, c'est pour çà que je te propose d'utiliser la classe stringw, tu dois les remplacer par message = L"ta nouvelle chaîne"
Hors ligne
OK merci ça marche
Un grand MERCI pour toute tes réponse rapide
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 85 invités en ligne Aucun membre connecté RSS Feed |