Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.3] Problem z kontenerem struktur związanych z dźwiękiem

Ostatnio zmodyfikowano 2015-08-27 14:43
Autor Wiadomość
bbcodepl
Temat założony przez niniejszego użytkownika
[SFML 2.3] Problem z kontenerem struktur związanych z dźwiękiem
» 2015-08-27 11:26:24
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
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.

C/C++
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;
}

/// Klasa dot. dzwieku:
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 ;)
P-136914
Monika90
» 2015-08-27 14:07:39
Dlaczego struktura audio_struct ma konstruktor kopiujący zdefiniowany przez programistę i dlaczego ten konstruktor nie kopiuje składowej sound_effect? Lepsze pytanie: dlaczego ta struktura w ogóle istnieje?

Twój kod jest pełen dziwnych i niezrozumiałych zjawisk. Zbędne void i średniki, porównywanie z false, new const int(8), testowanie wartości bool zwróconej z loadFromFile za pomocą switch, no i te nazwy...
P-136918
michal11
» 2015-08-27 14:43:46
C/C++
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 );
    }[ cpp ]
   
    Zastan ó w si ę co si ę dzieje w tym przypadku z rozmiarem vectora a co ze zmienn ą i, je ż eli element zostanie usuni ę ty.Dla u ł atwienia mo ż esz sobie rozrysowa ć symulacj ę.
P-136921
« 1 »
  Strona 1 z 1