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()
{
#ifdef _DEBUG
printf("CREATION DES POINTEURS IRRKLANG V 1.4.0\n");
#endif this->SoundEngine = createIrrKlangDevice();
if (!SoundEngine){
printf("ERROR : Sound Engine Not Started\n");
return false; }
else{
printf("SUCCES : Sound Engine Started\n");
}
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)
{
sound3D[userSound.id] = this->SoundEngine->play3D( GAME_SOUNDS[userSound.SOUND_NAME], userSound.position, userSound.loop, userSound.startPaused, false, ESM_AUTO_DETECT, false); if (this->sound3D[userSound.id]) {
std::cout<< "Sound EXISTE "<<std::endl;
this->sound3D[userSound.id] -> setVolume(userSound.Volume);
}else
{
std::cout<< "Sound EXISTE PAS "<< this->sound3D[userSound.id] <<std::endl;
}
}
}
Code de CGameSound.h
Code c++ :
class CGameSound
{ public: CGameSound
(IVideoDriver* driver
,ISceneManager* smgr
,IGUIEnvironment
* env
); ~CGameSound
(); 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
){ device
= createDevice
( EDT_OPENGL
, dimension2d<u32
>(1280,920), 32, false, false, false,0); if (!device
) return 1; driver
= device
->getVideoDriver
(); smgr
= device
->getSceneManager
(); guienv
= device
->getGUIEnvironment
(); CGameSound
* GameSound
= new CGameSound
(driver
,smgr
,guienv
); GameSound
->load_game_engine
(); ICameraSceneNode * CAM
= smgr
->addCameraSceneNodeFPS
( 0, 20.0f, 0.01f, -1, 0, 5, false, 0.1f, false, true); CAM
->setFarValue
(1000000.0f); 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)); GameSound
->setListenerPosition
(CAM
->getPosition
(),CAM
->getRotation
() ); smgr
->drawAll
(); guienv
->drawAll
(); driver
->endScene
(); fps
= driver
->getFPS
(); if (lastFPS
!= fps
) { core::stringw str
= L
"CREATION DES POINTEURS IRRKLANG V 1.4.0\n"; str
+= driver
->getName
(); str
+= "ERROR : Sound Engine Not Started\n"; str
+= fps
; device
->setWindowCaption
(str
.c_str
()); lastFPS
= fps
; } 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;}