To będzie chyba trudny orzech do zgryzienia, no ale od czego jest forum ^^. Mam oto taki błąd:
Po przytrzymaniu myszki co ułamek sekundy odtwarza się ten sam dźwięk, tyle że coś jest oczywiście nie tak.
W kodzie (na dole fragment), jeśli dźwięk zostanie do końca odtworzony, to jest on usuwany z kontenera, tyle że wtedy nie jest usuwany tylko 1 element, lecz... kilka, i to prawie na raz, wtedy kiedy pierwszy dźwięk się odtworzy w całości, a reszta dzwięków jest po prostu ucinana np. w połowie, bo zostają one usunięte.
output:
Nie wiem czemu wyświetla się kwestia destruktora, jeśli dźwięk nie został jeszcze do końca odtworzony - i to dwukrotnie...
1
1
1
why did u do that
why did u do that
2
2
2
why did u do that
why did u do that
3
3
3
why did u do that
why did u do that
...
dochodzi do 8 dzwiękow odtwarzanych na raz i nagle jest wielki chaos - wszystkie struktury są usuwane prawie na raz:
8
why did u do that
why did u do that
9
why did u do that
why did u do that
why did u do that
why did u do that
why did u do that
4
why did u do that
why did u do that
2
why did u do that
1
why did u do that
0
0
0
I jeśli przytrzymam przycisk myszy, to od nowa w ten sam sposób nalicza się do 8, itd. w kółko z tymi samymi błędami.
struct audio_struct
{
sf::Sound sound_effect;
int index;
double pitch;
int volume;
bool played;
audio_struct( int index, double pitch, int volume );
audio_struct( const audio_struct & original )
: index( original.index )
, pitch( original.pitch )
, volume( original.volume )
, played( original.played )
{ };
~audio_struct( void );
};
audio_struct::audio_struct( int that_index, double that_pitch, int that_volume )
{
index = that_index;
pitch = that_pitch;
volume = that_volume;
played = false;
}
audio_struct::~audio_struct()
{
std::cout << "why did u do that" << std::endl;
}
class audio_class
{
sf::SoundBuffer * sound_effects;
const int * sound_effects_amount;
std::vector < audio_struct > sounds;
public:
audio_class();
void load_audio( void )
{
for( int i = 0; i < * sound_effects_amount; i++ )
{
switch( sound_effects[ i ].loadFromFile( "audio/effects/effect_" + convert_to_string( i + 1 ) + ".wav" ) )
{
case false:
slap_player_with_error( 2001, "audio/effects/effect_" + convert_to_string( i + 1 ) + ".wav" );
break;
}
}
}
void play( int index, double pitch = 1, int volume = 100 )
{
if( sounds.size() < 128 )
{
audio_struct new_sound( index, pitch, volume );
audio_struct to_vector( new_sound );
sounds.push_back( to_vector );
}
}
void play_all_sounds( void )
{
for( int i = 0; i < sounds.size(); i++ )
{
if( sounds[ i ].sound_effect.getPlayingOffset() == sf::Time::Zero && sounds[ i ].played == true )
{
sounds.erase( sounds.begin() + i );
}
else if( sounds[ i ].played == false )
{
sounds[ i ].played = true;
sounds[ i ].sound_effect.setBuffer( sound_effects[ sounds[ i ].index ] );
sounds[ i ].sound_effect.setPitch( sounds[ i ].pitch );
sounds[ i ].sound_effect.setVolume( sounds[ i ].volume );
sounds[ i ].sound_effect.play();
}
}
std::cout << sounds.size() << std::endl;
}
};
audio_class::audio_class( void )
{
sound_effects_amount = new const int( 8 );
sound_effects = new sf::SoundBuffer[ * sound_effects_amount ];
}
audio_class audio;
Funkcja play_all_sounds jest caly czas odtwarzana w pętli.
Myślę, że ktoś zdoła mi się pomóc ;)