IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ogre Discussion :

InputListener


Sujet :

Ogre

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut InputListener
    Bonjour tous le monde,

    C'est jusque que je viens d'un autre site, j'avais poser une question mais je n'est pas eu de réponse.

    Mon problème est que j'ai créer (avec l'ai d'un tutoriel) une application Ogre a partir de zéro, tous c'est passer correctement jusque au moment ou j'ai dut créer un InputListener, Donc j'ai créer une classe avec toute les information sur la sourie et le clavier, mais le problème est quand je doit créer la métode createFrameListener() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void AppDemarrage::createFrameListener()
    {
    	mInputListener = new InputListener(mWindow, mCamera);
        mRoot->addFrameListener(mInputListener);
    }
    il me met ces message d'erreur :



    Voici les fichier, sans le main.cpp

    AppDemarrage.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <Ogre.h>
    #include "InputListener.h"
     
    class AppDemarrage
    {
    public:
    	AppDemarrage();
    	~AppDemarrage();
     
    	bool start();
     
    private:
    	void createScene();
    	void createFrameListener();
    	Ogre::Root *mRoot;
    	Ogre::Camera* mCamera;
    	Ogre::SceneManager* mSceneMgr;
    	Ogre::RenderWindow *mWindow;
    };
    AppDemarrage.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #include "AppDemarrage.h"
     
    AppDemarrage::AppDemarrage() : mRoot(0)
    {
    	start();
    }
     
    void AppDemarrage::createFrameListener()
    {
    	mInputListener = new InputListener(mWindow, mCamera);
        mRoot->addFrameListener(mInputListener);
    }
     
    bool AppDemarrage::start()
    {
    	mRoot = new Ogre::Root("plugins.cfg", "ogre.cfg", "Ogre.log");
     
    	Ogre::ConfigFile configFile;
    	configFile.load("resources.cfg");
     
    	Ogre::ConfigFile::SectionIterator seci = configFile.getSectionIterator();
    	Ogre::String secName, typeName, archName;
    	while (seci.hasMoreElements())
    	{
    		secName = seci.peekNextKey();
    		Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
    		Ogre::ConfigFile::SettingsMultiMap::iterator i;
    		for (i = settings->begin(); i != settings->end(); ++i)
    		{
    			typeName = i->first;
    			archName = i->second;
    			Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    				archName, typeName, secName);
    		}
    	}
     
    	if(!(mRoot->restoreConfig() || mRoot->showConfigDialog()))
    	{
    		return false;
    	}
     
    	// variante : configuration sans boite de dialogue
    	Ogre::RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem"); // Pour OpenGL : "OpenGL Rendering Subsystem"
    	mRoot->setRenderSystem(rs);
    	rs->setConfigOption("Full Screen", "Yes");
    	rs->setConfigOption("Video Mode", "1600 x 900 @ 32-bit colour");
    	rs->setConfigOption("VSync", "No");
     
    	mWindow = mRoot->initialise(true, "Ogre3D");
     
    	Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
    	Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
     
    	mSceneMgr = mRoot->createSceneManager("DefaultSceneManager", "Mon Scene Manager");
    	mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0f, 1.0f, 1.0f));
     
    	mCamera = mSceneMgr->createCamera("PlayerCam");
    	mCamera->setPosition(Ogre::Vector3(0,0,100));
    	mCamera->lookAt(Ogre::Vector3(0,0,0));
    	mCamera->setNearClipDistance(5);
     
    	Ogre::Viewport* vp = mWindow->addViewport(mCamera);
    	vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
    	mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
     
    	Ogre::Entity *ent = mSceneMgr->createEntity("pinguin", "penguin.mesh");
    	Ogre::SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    	node->attachObject(ent);
     
    	mRoot->startRendering();
    	createFrameListener();
     
    	while(true)
    	{
    		Ogre::WindowEventUtilities::messagePump();
     
    		if(mWindow->isClosed())
    			return false;
     
    		if(!mRoot->renderOneFrame())
    			return false;
    	}
    }
     
    void AppDemarrage::createScene()
    {
     
    }
     
    AppDemarrage::~AppDemarrage()
    {
    	OGRE_DELETE mRoot;
    	OGRE_DELETE mCamera;
    	OGRE_DELETE mSceneMgr;
    	OGRE_DELETE mWindow;
    	delete mRoot;
    }
    InputListener.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <Ogre.h>
    #include <OIS/OIS.h>
     
    class InputListener : public Ogre::FrameListener, public Ogre::WindowEventListener
    {
    public:
    	InputListener(Ogre::RenderWindow *wnd, Ogre::Camera *camera);
    	~InputListener();
     
    private:
    	bool frameRenderingQueued(const Ogre::FrameEvent& evt);
    	void startOIS();
    	virtual void windowResized(Ogre::RenderWindow* rw);
    	virtual void windowClosed(Ogre::RenderWindow* rw);
        Ogre::RenderWindow* mWindow;
        Ogre::Camera*       mCamera;
     
        OIS::InputManager*  mInputManager;
        OIS::Mouse*         mMouse;
        OIS::Keyboard*      mKeyboard;
    };
    InputListener.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include "InputListener.h"
     
    InputListener::InputListener(Ogre::RenderWindow *wnd, Ogre::Camera *camera)
    {
        mWindow = wnd;
        mCamera = camera;
    	startOIS();
    }
     
    bool InputListener::frameRenderingQueued(const Ogre::FrameEvent& evt)
    {
        if(mWindow->isClosed())
            return false;
     
        mKeyboard->capture();
        mMouse->capture();
     
        if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
            return false;
     
        return true;
    }
     
    void InputListener::startOIS()
    {
    	Ogre::LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
     
    	OIS::ParamList pl;
    	size_t windowHnd = 0;
    	std::ostringstream windowHndStr;
     
    	mWindow->getCustomAttribute("WINDOW", &windowHnd);
    	windowHndStr << windowHnd;
    	pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
     
    	mInputManager = OIS::InputManager::createInputSystem( pl );
    	mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, false ));
    	mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, false ));
     
    	windowResized(mWindow);
    	Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this);
    }
     
    void InputListener::windowResized(Ogre::RenderWindow* wnd)
    {
    	unsigned int width, height, depth;
    	int left, top;
    	wnd->getMetrics(width, height, depth, left, top);
     
    	const OIS::MouseState &ms = mMouse->getMouseState();
    	ms.width = width;
    	ms.width = height;
    }
     
    void InputListener::windowClosed(Ogre::RenderWindow* wnd)
    {
    	if( wnd == mWindow )
    	{
    		if( mInputManager )
    		{
    			mInputManager->destroyInputObject( mMouse );
    			mInputManager->destroyInputObject( mKeyboard );
     
    			OIS::InputManager::destroyInputSystem(mInputManager);
    			mInputManager = 0;
    		}
    	}
    }
     
    InputListener::~InputListener()
    {
    	Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this);
    	windowClosed(mWindow);
    }
    Moi j'ai remarquer que d'après ce que j'ai remarquer c'est que dans la classe ExampleApplication il y a tous ce qu'il fallait, mais la rien est ajouter, il faut tout faire sois même, j'ai essayer d'ajouter mInputListener sa enlevait les erreur mais ça ne marchait pas.

    Pouvez-vous m'aidez, s'il-vous-plait.

    Merci d'avance.

    Erwan28250

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 132
    Points : 283
    Points
    283
    Par défaut
    Bonjour,

    Dans la méthode AppDemarrage::createFrameListener, tu initialises une variable (mInputListener) qui n'a pas été déclarée. Il faut donc que tu l'ajoutes un membre mInputListener dans ta classe AppDemarrage.

    Visiblement tu as compris le problème puisque tu as essayé d'ajouter mInputListener. Pourquoi ça ne marchait pas ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    J'ai essayer d'ajouter un membre dans la classe AppDemarrage de différente façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputListener *mInputListener;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ogre::FrameListener *mInputListener;
    J'ai même essayer d'implémenter la méthode createFrameListener() de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void AppDemarrage::createFrameListener()
    {
        InputListener *mInputListener = new InputListener(mWindow, mCamera);
        mRoot->addFrameListener(mInputListener);
    }
    donc quand j'ouvre le programme tous s'affiche normalement :



    Moi j'utilise l'IDE Microsoft Visual C++ 2010 Express, et avec ce logiciel on peut ajouter un point d'arrêt, ce qui veut dire que en faite quand le débogueur arrive a la ligne choisit, il met tous en pause jusqu’à ce qu'on est dit de continuer et bien j'ai put remarquer grâce a ça que le débogueur ne lisait jamais cette ligne, j'ai même ajouter un point d'arrêt dans la classe InputListener, mais rien na faire, il ne sarrette jamais a ce point, ce qui veut dire qu'il ne lit pas cette endroit.

    J'ai essayer d'ajouter au début de la méthode start(), celle ou ce passe tout le programme, et bien j'ai ajouter createFrameListener();, quand j'ouvre le fichier, il lit la méthode createFrameListener(), mais il m'affiche un message d'erreur :



    et ensuite in me met une flèche j'aune dans la le fichier InputListener.cpp :




    Donc je ne c'est pas quoi faire pour que sa marche.

    Erwan28250

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    OK c'est bon j'ai trouver le problème, j'ai ajouter createFrameListener() dans la méthode start() que je ne vous avait pas montrer, donc je vous la montre maitenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    bool AppDemarrage::start()
    {
    	mRoot = new Ogre::Root("plugins.cfg", "ogre.cfg", "Ogre.log");
     
    	Ogre::ConfigFile configFile;
    	configFile.load("resources.cfg");
     
    	Ogre::ConfigFile::SectionIterator seci = configFile.getSectionIterator();
    	Ogre::String secName, typeName, archName;
    	while (seci.hasMoreElements())
    	{
    		secName = seci.peekNextKey();
    		Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
    		Ogre::ConfigFile::SettingsMultiMap::iterator i;
    		for (i = settings->begin(); i != settings->end(); ++i)
    		{
    			typeName = i->first;
    			archName = i->second;
    			Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    				archName, typeName, secName);
    		}
    	}
     
    	if(!(mRoot->restoreConfig() || mRoot->showConfigDialog()))
    	{
    		return false;
    	}
     
    	// variante : configuration sans boite de dialogue
    	Ogre::RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem"); // Pour OpenGL : "OpenGL Rendering Subsystem"
    	mRoot->setRenderSystem(rs);
    	rs->setConfigOption("Full Screen", "No");
    	rs->setConfigOption("Video Mode", "800 x 600 @ 32-bit colour");
    	rs->setConfigOption("VSync", "No");
     
    	mWindow = mRoot->initialise(true, "Ogre3D");
     
    	Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
    	Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
     
    	mSceneMgr = mRoot->createSceneManager("DefaultSceneManager", "Mon Scene Manager");
    	mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0f, 1.0f, 1.0f));
     
    	mCamera = mSceneMgr->createCamera("PlayerCam");
    	mCamera->setPosition(Ogre::Vector3(0,0,100));
    	mCamera->lookAt(Ogre::Vector3(0,0,0));
    	mCamera->setNearClipDistance(5);
     
    	createFrameListener();
     
    	Ogre::Viewport* vp = mWindow->addViewport(mCamera);
    	vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
    	mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
     
    	Ogre::Entity *ent = mSceneMgr->createEntity("pinguin", "penguin.mesh");
    	Ogre::SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    	node->attachObject(ent);
     
    	mRoot->startRendering();
     
    	while(true)
    	{
    		Ogre::WindowEventUtilities::messagePump();
     
    		if(mWindow->isClosed())
    			return false;
     
    		if(!mRoot->renderOneFrame())
    			return false;
    	}
    }
    donc le programme s'ouvre, la sourit disparait, je vous avait expliquer que dans le tutoriel on avait programmer la touche échappe, pour que le programme ce ferme, mais la quand je clique le programme ce ferme, il ce rouvre immédiatement, ensuite je re clique une autre fois et la le programme ce ferme définitivement, avec le débogueur j'ai ajouter un point d'arrêt a l'appelle de la méthode createFrameListener();, et bien je me suit rendut conte qu'il l'appelait deux fois.

    Pouvez-vous m'aidez, je vais continuer a chercher de mon coter.

    Erwan28250

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 132
    Points : 283
    Points
    283
    Par défaut
    Attention : les breakpoints (point d'arrêts) sont utilisés seulement si tu compiles et exécutes ton programme en configuration DEBUG, avec la génération des informations de débogage activée dans les paramètres du projet Visual Studio. Ah mais sur ta capture d'écran ça a l'air de fonctionner, donc les options du projet semblent ok ?

    En déclarant ton attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputListener *mInputListener;
    Je pense que ça doit marcher. Essaie d'ajouter la gestion d'une touche (par exemple pour déplacer ton manchot) dans la méthode InputListener::frameRenderingQueued.

    EDIT : je vois que tu as répondu entre-temps. Regarde dans la pile des appels d'où est appelé ta méthode la deuxième fois.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    Ben j'ai regarder voici deux photo du premier appel et du deuxième appel :

    premier appel


    deuxième appel



    On voit que la deuxième ligne en partant du haut, je n'est pas compris, mais j'ai vue que la première fois c'est la ligne 17 qui est appeler et la deuxième fois c'est la ligner 27 qui est appeler, j'ai regarder, tout viens du fichier main.cpp.

    voici le code du main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include "AppDemarrage.h"
     
    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    #define WIN32_LEAN_AND_MEAN
    #include "windows.h"
    #endif
     
    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
    #else
    int main(int argc, char *argv[])
    #endif
    {
        AppDemarrage app;
     
        try {
            app.start();
        } catch( Ogre::Exception& e ) {
    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
    #else
            std::cerr << "An exception has occured: " <<
                e.getFullDescription().c_str() << std::endl;
    #endif
        }
     
        return 0;
    }
    j'ai regarder la première fois c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.start(); //de la ligne 17 qui est appeler.
    et ensuite c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return 0; //de la ligne 27 qui est appeler, tous viens de la
    et la dernière fois que je clique sur échappe, le débogueur met ce message



    Erwan28250

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 132
    Points : 283
    Points
    283
    Par défaut
    Ok je vois. Tu appelles effectivement la méthode start deux fois : dans le constructeur de AppDemarrage, puis directement dans ton main. Retire l'appel qui se trouve dans le constructeur.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    Ok, j'ai une dernière erreur, c'est juste que quand je quitter le programme le programme reste dans les processus, il faut a chaque fois faire arrêter le processus, c'est un peut embêtant a la longue .

    Je c'est pas trop d'où sa vient.

    Et Beaucoup.

    Erwan28250

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    OK, c'est bon, c'est juste que j'avais pas attendu assez longtemps.

    de m'avoir aidez.

    Erwan28250

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo