20-10-2007 22:59:59
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
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
21-10-2007 07:58:30
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.31.229.57
- Courriel
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. ![]()
Hors ligne
21-10-2007 08:01:59
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
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("\
");
}
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
21-10-2007 08:18:01
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.31.229.57
- Courriel
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
21-10-2007 08:23:58
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
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
21-10-2007 08:30:36
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.31.229.57
- Courriel
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
21-10-2007 08:34:19
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
J'ai pas trop compris ta dernière phrase :
appeler la méthode c_str() de ton objet stringw
Hors ligne
21-10-2007 08:40:11
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.31.229.57
- Courriel
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
21-10-2007 08:53:51
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
Si je suis ton exemple faut que je mette
core::stringw message = L"Ceci est un objet stringw";
message.c_str();???
Hors ligne
21-10-2007 09:19:44
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.31.229.57
- Courriel
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 swprintfHors ligne
21-10-2007 09:36:15
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
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
Hors ligne
21-10-2007 09:40:13
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.31.229.57
- Courriel
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
21-10-2007 09:42:11
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.98.115.179
- Courriel
OK merci ça marche
Un grand MERCI pour toute tes réponse rapide
Hors ligne



