22-05-2017 12:09:36
- jonath313
- Membres
- Date d'inscription:
- Messages: 240
- IP: 217.128.73.71
- Courriel
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;
}
Hors ligne
22-05-2017 21:21:09
- jonath313
- Membres
- Date d'inscription:
- Messages: 240
- IP: 86.216.58.158
- Courriel
Problème résolu !
Ne me demandez pas pourquoi, mais dans la fonction play3D il faut activer le paramètre "track" (=true) pour que çà fonctionne.
Voila merci qd même ![]()
Hors ligne
22-05-2017 21:32:25
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 109.190.12.31
- Courriel Site web
edit: ok ! ![]()
ps:
You don't check if play2D returns a valid pointer. According to the docs Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played.
Hors ligne
22-05-2017 21:50:47
- jonath313
- Membres
- Date d'inscription:
- Messages: 240
- IP: 86.216.58.158
- Courriel
Avec l'explication c'est mieux.
Oui mais j'aurais jamais imaginé que çà puisse éxister ainsi !!
Merci bien!
Hors ligne



