17-08-2007 21:54:17
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 90.2.51.247
- Courriel
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
#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
#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
#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;
};
#endifet 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
18-08-2007 07:09:39
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.152.37.42
- Courriel 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)
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
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
18-08-2007 08:37:17
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 90.2.51.247
- Courriel
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
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à:
(time/500 % 2) ? imp1 : imp2tu pourrais m'expliquer stp ?
Hors ligne
18-08-2007 09:25:59
- Nebu
- Membres
- Date d'inscription:
- Messages: 5
- IP: 213.213.223.84
- Courriel
C'est un raccourci de if
ca se traduit par
if (time / 500 % 2)
valeur = imp1
else
valeur = imp2
Hors ligne
18-08-2007 13:35:03
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 90.35.66.38
- Courriel
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":
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
19-08-2007 11:16:29
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.153.2.137
- Courriel 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
19-08-2007 17:45:00
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 81.249.26.16
- Courriel
ma fonction rectangle et son contexte:
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 ?
Hors ligne
19-08-2007 17:59:48
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.16.137.19
- Courriel 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
19-08-2007 19:31:55
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 81.249.26.16
- Courriel
normal j'ai une 800*600
mais c'est pas grave si je laisse sa comme ça ?
Hors ligne
19-08-2007 19:56:00
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.153.2.137
- Courriel Site web
bin si ![]()
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
19-08-2007 20:18:16
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 81.249.26.16
- Courriel
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
19-08-2007 20:56:23
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.16.137.19
- Courriel 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
.
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
19-08-2007 21:15:21
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 81.249.26.16
- Courriel
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
20-08-2007 03:25:13
- lucky56
- Membres

- Date d'inscription:
- Messages: 4
- IP: 85.192.253.125
- Courriel
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
20-08-2007 06:46:07
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 81.249.26.16
- Courriel
très bonne remarque j'avais pas fais gaffe a sa.
Mais le problème est toujours là
Hors ligne
21-08-2007 14:44:47
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 83.199.10.191
- Courriel
personne n'a d'idée ?
Hors ligne
22-08-2007 14:30:14
- vrag
- Membres
- Date d'inscription:
- Messages: 61
- IP: 90.2.115.120
- Courriel
c'est bon mon programme marche. Merci a ceux qui m'ont aider
Hors ligne



