Historique des modifications - Message

Message #11810

Sujet: Problème de création de pointeur


Type Date Auteur Contenu
Création du message 22-05-2017 12:09:36 jonath313
Bonjour!

J'ai un problème avec un pointeur et je ne comprends pas l'origine de soucis.
Ce qu'il se passe c'est que je crée mon pointeur ISound* via ma classe CGameSound.
Pour l'exemple je l'ai déclaré en private par ISound* sound3D[2];

Quand j'initialise dans le main je fais load_game_engine() qui me crée le SoundEngine.
Ensuite j'utilise une strucure SOUND_3D_t pour créer une config de son 3D.

Le soucis c'est que si je fais sound3D[0] = SoundEngine->play3D(...) dans la fonction load_game_engine(), mon pointeur est bien créé et il contient une valeur.
Mais mon but c'est de le créer dans la fonction create_sound3D(SOUND_3D_t &userSound), et pour le même sound3D[0] = SoundEngine->play3D(...), je constate quand je fais if (this->sound3D[userSound.id]) que mon pointeur vaut 0 alors que le son est joué et le programme se lance.
C'est bloquant car si je veut faire un sound3D[0]->setVolume(...), le programme plante littéralement.

J'ai essayé pleins de choses, j'ai même tout recodé plusieurs fois et de plusieurs façons mais rien n'y fais, il y a quelque chose que je fais mal mais je ne vois pas.
Si quelqu'un peut m'éclairer ...

Code de CGameSound.cpp

Code c++ :

 
int CGameSound::load_game_engine()
{
     ///**** Initialisation de Irrklang
    #ifdef _DEBUG
    printf("CREATION DES POINTEURS IRRKLANG V 1.4.0\
");
    #endif // _DEBUG
    this->SoundEngine = createIrrKlangDevice();
    if (!SoundEngine){
        printf("ERROR : Sound Engine Not Started\
");
        return false; // error starting up the engine
    }
    else{
        printf("SUCCES : Sound Engine Started\
");
    }

	/// ICI çà FONCTIONNE
    sound3D[0] = SoundEngine->play3D("media/sound/guitar2.ogg",
                                  vec3df(0,0,0), true, false, true);
    if (sound3D[0])
    {
      sound3D[0]->setMinDistance(5.0f);
      sound3D[0]->setVolume(0.2f);
      std::cout<< "HAAAAAAAAAAAAAAA "<< sound3D[0] <<std::endl;
    }
}


void CGameSound::create_sound3D(SOUND_3D_t &userSound)
{
    if(this->SoundEngine != NULL)
    {
        // Creation du son
        sound3D[userSound.id] = this->SoundEngine->play3D(  GAME_SOUNDS[userSound.SOUND_NAME],  // sound file
                                                            userSound.position,                 // position
                                                            userSound.loop,                     // loop
                                                            userSound.startPaused,              // startPaused
                                                            false,                              // track
                                                            ESM_AUTO_DETECT,                    // streamMode
                                                            false);                             // enableSoundEffects
        if (this->sound3D[userSound.id])	// ICI LE POINTEUR ISOUND VAUT 0
        {
            std::cout<< "Sound EXISTE "<<std::endl;
            this->sound3D[userSound.id] -> setVolume(userSound.Volume);
            ///userSound.sound->drop(); // release music stream.
        }else
        {
            std::cout<< "Sound EXISTE PAS "<< this->sound3D[userSound.id] <<std::endl;
        }


    }

}

Code de CGameSound.h

Code c++ :

 
class CGameSound
{
    public:                                                                      //! CLASSE ...................................................... |
        CGameSound(IVideoDriver* driver,ISceneManager* smgr,IGUIEnvironment* env);//| Constructeur ................................................ |
        ~CGameSound();                                                           //| Destructeur ................................................. |

        int load_game_engine();
        void create_sound3D(SOUND_3D_t &userSound);
        void setListenerPosition(vector3df Position, vector3df Orientation);
        void create_sound2D(SOUND_2D_t &userSound);

    private:
        IVideoDriver* Driver;
        ISceneManager* Smgr;
        IGUIEnvironment* Env;

        ISoundEngine* SoundEngine;

        ISound* sound3D[2];
        ISound* sound2D[2];

    protected:
};


Structure sound

Code c++ :


struct SOUND_3D_t
{
    int id                  = 0;
    GAME_SOUND_e SOUND_NAME = SOUND_CAISSE;
    vector3df position      = vector3df(0.0f,0.0f,0.0f);
    bool    startPaused     = false;
    bool    play            = false;
    bool    loop            = false;
    bool    debug           = false;
    float   Volume          = 0.5f;

};

Code du main

Code c++ :

 
#include <iostream>
#include <irr/irrlicht.h>
#include <stdio.h>
#include <time.h>

#include "CGameSound.h"
#include "HGameSound.h"

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

IrrlichtDevice *device;
IVideoDriver* driver;
ISceneManager* smgr;
IGUIEnvironment* guienv;

int fps;
s32 now = 0;
s32 lastFPS = -1;
u32 lastTime = 0;

int main( int argc, char** argv )
{
    /// Initialisation
	device = createDevice( EDT_OPENGL, dimension2d<u32>(1280,920), 32, false, false, false,0); //EDT_SOFTWARE EDT_OPENGL
	if (!device)    return 1;
	driver  = device->getVideoDriver();
	smgr    = device->getSceneManager();
	guienv  = device->getGUIEnvironment();

	//CGameSound GameSound(driver,smgr,guienv);

	CGameSound* GameSound = new CGameSound(driver,smgr,guienv);

	GameSound->load_game_engine();

	 ICameraSceneNode * CAM = smgr->addCameraSceneNodeFPS (
                                 0,       // le noeud parent de la caméra
                                 20.0f,    // la vitesse de rotation de la caméra
                                 0.01f,    // la vitesse de déplacement
                                 -1,      // numéro d'identification du noeud
                                 0,       // une map permettant de re-affecter les touches
                                 5,       // taille de la keyMap
                                 false,   // autorise ou non les mouvements sur l'axe vertical
                                 0.1f,    // vitesse de déplacement lors d'un saut
                                 false,   // inverse ou non la rotation de la caméra
                                 true);   // indique si la caméra doit être active ou non
    CAM->setFarValue(1000000.0f);

	/// TEST SON 3D
    /// Creation d'un son test
    SOUND_3D_t  testSon;
    testSon.id          = 0;
    testSon.SOUND_NAME  = SOUND_CAISSE;
    testSon.startPaused = false;
    testSon.loop        = true;
    testSon.play        = true;
    testSon.position    = CAM -> getPosition();
    testSon.debug       = true;
    testSon.Volume      = 0.1f;

    GameSound->create_sound3D(testSon);

	while(device->run())
	{
		driver->beginScene(true, true, SColor(255,100,101,140));

        //! Mise à jour son 3d
        GameSound->setListenerPosition(CAM->getPosition(),CAM->getRotation() );

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

		fps = driver->getFPS();
		if (lastFPS != fps)
		{
			core::stringw str = L"SOUND   [";
			str += driver->getName();
			str += "] FPS:";
			str += fps;
			device->setWindowCaption(str.c_str());
			lastFPS = fps;
		}

		// controle de l'attente jusqu'à la prochaine frame
		u32 Time = device->getTimer()->getTime();
		u32 TimeLimite = lastTime + 17;
		if(Time >= TimeLimite) lastTime = Time;
		else
		{
			device->sleep( TimeLimite - Time );
			lastTime = TimeLimite;
		}
	}
	device->drop();
	return 0;
}

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
216 invités en ligne
membre en ligne: -
RSS Feed