#0 

17-08-2007 23:54:17

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

bonjour tout le monde,

voilà j'ai un problème avec mon code et je ne sais pas comment le résoudre. J'ai posé la question sur le forum du siteduzero mais le problème n'a pas été résolu.
Comme il concerne irrlicht je vais maintenant vous le présenter.
J'ai une classe afficherImage qui doit charger une image et récupérer sa position. Mais il doit y avoir un problème quelque part parce que quand je veux récupérer la position de l'image dans la boucle de rendu de mon main, ma compilation plante.
Voici mon code:

main.cpp

Code:

#include <irrlicht.h>
#include <iostream>
#include "main.hpp"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
using namespace std;

AfficherImage* afficherImage;//C'est la seule chose qui est dans le main.hpp donc je le met ici

int main()
{
    video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;

        IrrlichtDevice *Device = createDevice(EDT_SOFTWARE, dimension2d<s32>(800, 600), 16,
                        false, false, false, 0);

    if (Device == 0)
    return 1; // could not create selected driver.

        Device->setWindowCaption(L"Equilibrum : La malediction");

        IVideoDriver* driver = Device->getVideoDriver();
        ISceneManager* smgr = Device->getSceneManager();
        IGUIEnvironment* guienv = Device->getGUIEnvironment();

    afficherImage->afficherMenu();

        Device->setResizeAble(true);


        while(Device->run())
        {
            u32 time = Device->getTimer()->getTime();

                driver->beginScene(true, true, SColor(0,0,0,0));

        driver->draw2DImage(afficherImage->get_interfaceMenu(), afficherImage->get_rectangle(),
        SColor (255,255,255,255), true);

        //pour afficher les positions du curseur dans la barre de titre :
        core::position2d<s32> mouse = Device->getCursorControl()->getPosition();

        //pour afficher les positions du curseur dans la barre de titre :
        core::stringw titre = L"Positions de la souris :";
        titre += mouse.X;
        titre += L"-";
        titre += mouse.Y;

        Device->setWindowCaption(titre.c_str());

                smgr->drawAll();
                guienv->drawAll();

                driver->endScene();
        }

        Device->drop();

        return 0;
}

afficherImage.cpp

Code:

#include <irrlicht.h>
#include <iostream>
#include "afficherImage.hpp"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
using namespace std;

int AfficherImage::afficherMenu()
{
    interfaceMenu = driver->getTexture ("Interface/interface_hors_jeu/menu_principale/interfaceMenu1.PNG");
    if (interfaceMenu == 0)
    {
        cout << "probleme de chargement de l'image" << endl;
        return 1;
    }

    //La transparence pour le fond
    driver->makeColorKeyTexture (interfaceMenu, video::SColor (0,255,0,255));

    //On récupère les dimensions de l'image
    dimension2d<s32> taille = interfaceMenu->getSize ();

    //On crée une position qui va représenter l'origine
    position2d<s32> position0;
    position0.X = 0;
    position0.Y = 0;
    //Et maintenant la position du coin bas droit du rectangle en se servant des dimensions de l'image
    position2d<s32> position1;
    position1.X = taille.Width;
    position1.Y = taille.Height;

    //On crée la variable rectangle
    rect<s32> rectangle;
    rectangle.UpperLeftCorner = position0;
    rectangle.LowerRightCorner = position1;
}

afficherImage.hpp

Code:

#include <irrlicht.h>
#include <iostream>

#ifndef DEF_AFFICHER_IMAGE
#define DEF_AFFICHER_IMAGE

class AfficherImage
{
  public:

    AfficherImage();
    ~AfficherImage();

    int afficherMenu();

    irr::core::position2d<irr::s32> get_position0()
    {
        return position0;
    }
    irr::core::position2d<irr::s32> get_position1()
    {
        return position1;
    }
    irr::core::rect<irr::s32> get_rectangle()
    {
        return rectangle;
    }

    irr::video::ITexture* get_interfaceMenu()
    {

        return interfaceMenu;
    }



    private:

    irr::video::IVideoDriver* driver;
    irr::video::ITexture *interfaceMenu;
    irr::core::position2d<irr::s32> position0;
    irr::core::position2d<irr::s32> position1;
    irr::core::rect<irr::s32> rectangle;


};

#endif

et voici le rapport d'erreur:

main.cpp:54: error: no matching function for call to `irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*, irr::core::rect<irr::s32>, irr::video::SColor, bool)'
C:/Program Files/CodeBlocks/mingw32/include/Irrlicht/IVideoDriver.h:481: note: candidates are: virtual void irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*, const irr::core::position2d<irr::s32>&)
C:/Program Files/CodeBlocks/mingw32/include/Irrlicht/IVideoDriver.h:498: note:                 virtual void irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*, const irr::core::position2d<irr::s32>&, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>*, irr::video::SColor, bool)
C:/Program Files/CodeBlocks/mingw32/include/Irrlicht/IVideoDriver.h:523: note:                 virtual void irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*, const irr::core::position2d<irr::s32>&, const irr::core::array<irr::core::rect<irr::s32>, irr::core::irrAllocator<irr::core::rect<irr::s32> > >&, const irr::core::array<irr::s32, irr::core::irrAllocator<irr::s32> >&, irr::s32, const irr::core::rect<irr::s32>*, irr::video::SColor, bool)
C:/Program Files/CodeBlocks/mingw32/include/Irrlicht/IVideoDriver.h:535: note:                 virtual void irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>*, irr::video::SColor*, bool)


Sa fait trois jour que j'ai ce problème et je ne vois aucune réponse. Est-ce que vous pourriez m'aider svp ?

Merci d'avance.

Hors ligne


#1 

18-08-2007 09:09:39

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

yop,
Comme dit dans l'erreur, tu appelles mal la fonction draw2Dimage :
elle doit avoir en paramètre (par exemple, il y a différentes surcharges possibles citées dans l'erreur) texture, destRec, soureRect, clipRect, color, alpha, ce qui doit te donner par exemple :
(dans la boucle)

Code:

driver->draw2DImage(afficherImage->get_interfaceMenu(),
                                  afficherImage->get_rectangle(),
                                  afficherImage->get_ImageSize() /* à implémenter ! */
                                  0
                                  SColor (255,255,255,255), 
                                  true);

Je te conseille de regarder l'exemple 06.2DGraphics

Après modification de ça, ton programme va compiler sans erreurs (à vue de nez), et va planter avec la petite fenetre de rapport d'erreurs smile Ton "driver", membre privé de ta classe AfficherImage ne pointe vers rien. Donc quand tu va vouloir l'utiliser dans la méthode AfficherMenu(), ca va planter.
Il faut que tu passes le pointeur vers le driver créé dans le main() en paramètre dans une de tes fonctions (ou dans le constructeur) de la classe AfficherImage(). COmme ça il aura l'adresse du bon driver et il pourra l'utiliser.

plouf


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#2 

18-08-2007 10:37:17

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

j'ai suivi tes conseils et j'ai déjà résolu le problème du driver
je suis allé voir l'exemple 06, mais il y a un truc que j'ai pas compris :

c'est dans cette fonction

Code:

driver->draw2DImage(images, core::position2d<s32>(270,105),
                (time/500 % 2) ? imp1 : imp2, 0, 
                video::SColor(255,(time) % 255,255,255), true);

plus précisément à ce niveau là:

Code:

(time/500 % 2) ? imp1 : imp2

tu pourrais m'expliquer stp ?

Hors ligne


#3 

18-08-2007 11:25:59

Nebu
Petit nouveau
Date d'inscription: 31-07-2007
Messages: 5

C'est un raccourci de if
ca se traduit par
if (time  / 500 % 2)
valeur = imp1
else
valeur = imp2

Hors ligne


#4 

18-08-2007 15:35:03

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

ok merci

j'ai modifié mon code et maintenant la compilation marche (c'est déjà une bonne chose), mais l'image ne veut pas s'afficher.

voici le nouveau "code":

Code:

driver->draw2DImage(afficherImage->get_interfaceMenu(),
                                afficherImage->get_position0(),
                                afficherImage->get_rectangle(), 0,
                                SColor (255,255,255,255), true);

j'ai rien modifié d'autre mais je pense que c'est un problème au niveau du rectangle mais je suis pas sur. Je vais creuser cette piste pour voir mais je refuse pas un peu d'aide ^^.

Hors ligne


#5 

19-08-2007 13:16:29

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

vérifie bien que le get_Rectangle retourne la taille de l'image


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#6 

19-08-2007 19:45:00

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

ma fonction rectangle et son contexte:

Code:

interfaceMenu = driver->getTexture ("interface.PNG");
    if (interfaceMenu == 0)
    {
        cout << "probleme de chargement de l'image" << endl;
        return 1;
    }

    //La transparence pour le fond
    driver->makeColorKeyTexture (interfaceMenu, video::SColor (0,255,0,255));

    //On récupère les dimensions de l'image
    dimension2d<s32> taille = interfaceMenu->getSize ();

    //On crée une position qui va représenter l'origine
    position2d<s32> position0;
    position0.X = 0;
    position0.Y = 0;
    //Et maintenant la position du coin bas droit du rectangle en se servant des dimensions de l'image
    position2d<s32> position1;
    position1.X = taille.Width;
    position1.Y = taille.Height;

    //On crée la variable rectangle
    rect<s32> rectangle;
    rectangle.UpperLeftCorner = position0;
    rectangle.LowerRightCorner = position1;

ma fonction rectangle récupère la taille de mon image, enfin je pense. Je me trompe ?

autre chose, quand je regarde la console, elle me dit que l'image est bien chargé (c'est un bon début) mais ensuite elle me met :

Performance warning, slow unlock of non power of 2 texture.


Sa veut dire quoi ?

Dernière modification par vrag (19-08-2007 19:51:57)

Hors ligne


#7 

19-08-2007 19:59:48

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Salut,
Ca veut dire que ta texture n'est pas une puissance de 2 donc qu'elle ne respecte pas le standard 128*128 ou 128*256 ou 256*256 etc....


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#8 

19-08-2007 21:31:55

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

normal j'ai une 800*600
mais c'est pas grave si je laisse sa comme ça ?

Hors ligne


#9 

19-08-2007 21:56:00

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

bin si smile
Ca risque de merder/pas marcher sur certaines cartes graphiques.
En revanche je sais pas trop si ça vient de là


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#10 

19-08-2007 22:18:16

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

hmm c'est facheux

je résous (si vous pourriez m'aider sa serait plus rapide ^^) mon problème d'affichage et j'essaye ensuite de changer ça.
Par contre je ne vois pas comment faire pour mon pb n°1. Logiquement tout doit être bon, mais apparament c'est pas le cas.

Hors ligne


#11 

19-08-2007 22:56:23

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Na avant tout,vérifi bien que tes textures sont toute en ^2 sinon on peut même pas avoir la certitude que ta carte va l'afficher et par conséquent si le problème vient de là on va tous perdre notre temps smile.


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#12 

19-08-2007 23:15:21

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

j'ai chargé qu'une seule image donc si l'erreur vient de quelque part c'est de là.
j'ai créé une image en 256*256 et l'erreur a disparu donc izguit tu avais raison
mais même en ayant changé cette image elle ne s'affiche toujours pas. Il doit y avoir une erreur quelque part

Hors ligne


#13 

20-08-2007 05:25:13

lucky56
Petit nouveau
Date d'inscription: 21-06-2007
Messages: 4

Code:

ideo::E_DRIVER_TYPE driverType = video::EDT_OPENGL;

        IrrlichtDevice *Device = createDevice(EDT_SOFTWARE, dimension2d<s32>(800, 600), 16,
                        false, false, false, 0);

Pourquoi tu mets EDT_SOFTWARE au lieu de drivertype ou EDT_OPENGL ?
Ce n'est peut être pas la cause, mais essaye toujours.

Hors ligne


#14 

20-08-2007 08:46:07

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

très bonne remarque j'avais pas fais gaffe a sa.
Mais le problème est toujours là

Hors ligne


#15 

21-08-2007 16:44:47

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

personne n'a d'idée ?

Hors ligne


#16 

22-08-2007 16:30:14

vrag
Membre
Date d'inscription: 30-06-2007
Messages: 61

c'est bon mon programme marche. Merci a ceux qui m'ont aider

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
52 invités en ligne
Aucun membre connecté
RSS Feed