#0 

21-10-2007 00:59:59

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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


#1 

21-10-2007 09:58:30

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

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. smile

Dernière modification par Perceval (21-10-2007 09:58:53)

Hors ligne


#2 

21-10-2007 10:01:59

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

ok voici mon code

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


#3 

21-10-2007 10:18:01

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Je sais pas si ton erreur vient de là ou pas, mais çà :

Code:

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


#4 

21-10-2007 10:23:58

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

OUi j'avais a l'origine essayer avec stringw Mais j'était tombé sur ça:

Code:

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


#5 

21-10-2007 10:30:36

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

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 smile

Hors ligne


#6 

21-10-2007 10:34:19

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

J'ai pas trop compris ta dernière phrase :
appeler la méthode c_str() de ton objet stringw

Hors ligne


#7 

21-10-2007 10:40:11

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Je suppose que t'as déclaré un objet stringw quelque part dans ton code :

Code:

stringw str = L"Ceci est un objet stringw";

Quand je parles d'appeler sa méthode c_str(), je veux dire écrire çà :

Code:

str.c_str();

qui va te rendre un wchar_t* smile

Hors ligne


#8 

21-10-2007 10:53:51

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

Si je suis ton exemple faut que je mette

Code:

core::stringw message = L"Ceci est un objet stringw";
message.c_str();

???

Hors ligne


#9 

21-10-2007 11:19:44

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Non, en fait je vois çà smile :

Code:

// 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


#10 

21-10-2007 11:36:15

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

Ok ça c'est bon mais arriver à cette ligne

Code:

    swprintf(message.c_str(), L"Mise a jour", 224);

un message d'erreur s'affiche

Code:

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


#11 

21-10-2007 11:40:13

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

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" smile

Hors ligne


#12 

21-10-2007 11:42:11

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

OK merci ça marche
Un grand MERCI pour toute tes réponse rapide

Hors ligne


#13 

21-10-2007 11:44:51

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

De rien wink

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
13 invités en ligne
Aucun membre connecté
RSS Feed