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

[Allegro] podkład muzyczny - problem

Ostatnio zmodyfikowano 2011-01-26 19:02
Autor Wiadomość
yyy...mleko
Temat założony przez niniejszego użytkownika
[Allegro] podkład muzyczny - problem
» 2011-01-21 20:52:37
Na wstępie chciałbym przeprosić jeśli taki temat już istnieje, ale nigdzie nie mogę znaleźć odpowiedzi na mój problem.
Tworze gierkę - strzelanie wszystko ładnie idzie lecz trafiłem na problem z dźwiękiem mianowicie chcę zrobić podkład, ładuje, odpalam muzyczka, leci, wszystko jest ok, lecz zanika on po włączeniu kilku innych dźwięków (w moim przypadku głos wystrzału broni). Nie wiem dokładnie, ale chodzi tu o jakby rezerwę tych dźwięków (czy coś w tym stylu) znalazłem funkcje:
reserve_voices(); - http://www.allegro.cc/manual/4/api/sound-init-routines/reserve_voices
która wydłuża ilość tych dźwięków do max 64, lecz dla mnie jest to za mało bo te 64 szybko miną ( szczególnie gdy się strzela z KM ;p )
Moje pytanie jest następujące:
Czy da się wydłużyć ilość tych dźwięków do nieskończoności, zignorowanie tego, czy po prostu istnieje funkcja, która ten podkład zachowuje (czy jak to powiedzieć ;))?
Nie wiem czy wyraziłem się jasno xD
P-26789
DejaVu
» 2011-01-21 20:57:40
Zapewne to chodzi o liczbę dźwięków odtwarzanych naraz. Przecież dźwięk strzału broni nie trwa w nieskończoność - to jest ułamek sekundy...
P-26791
yyy...mleko
Temat założony przez niniejszego użytkownika
» 2011-01-21 21:17:59
Nie wiem o co chodzi normalnie podkład zanika po 8 strzałach, gdy dam funkcje reserve_voices(); i ustawie ja na 64 to podkład zanika po 64 strzałach
P-26796
DejaVu
» 2011-01-21 22:17:49
Być może da się ustalać do których kanałów wysyłasz dźwięki. Zostaw jeden na muzykę, a pozostałe 63 na efekty. Jak to zrobić - trzeba doczytać w dokumentacji przede wszystkim jak wysyłać dźwięk do konkretnego kanału.
P-26803
dmx81
» 2011-01-22 12:35:02
moze pokaz kod, bo Pan Piotr chyba dobrze napisal, ze dzwiek nie trwa w nieskonczonosc - chodzi o to, zebys nie tworzyl naraz wszytskich wystrzalow, ale ze jak skonczy sie jeden wystrzal, to zaczyna nasteopny( logiczne - tak jak w realu - pociski wybuchaja po kolei:) ) a z tego co piszesz, to trwa jeden dzwiek wystrzalu, nie konczy sie, tylko ladujesz nastepny (tak jakby dzwieki wystrzalu byly kazdorazowo ladowane do petli odtwarzania zamiast jednorazowo) ja np u siebie w gierce mialem kilkanascie roznych dzwiekow naraz ( dzwiek silnika heli, dzwiek drabinki wysuwanej, podklad muzyczny tzn melodyjka, do tego kilka roznych dzwiekow imitujacych burze, eksplozje itd itd i wszytsko ladnie dzialalo jednoczesnie) nie chce mi sie wierzyc ze uzywasz naraz wiecej niz 64 rozne dzwieki ( nie myl pojecia 64 dzwieki z 64 wystrzaly - bo wystrzal to wciaz jeden dzwiek) jak wyzej napisalem, wrzuc kod odpowiedzialny za ladowanie dzwiekow i ich odtwarzanie
P-26826
yyy...mleko
Temat założony przez niniejszego użytkownika
» 2011-01-22 12:54:39
Wrzucę cały kod :)

C/C++
#include <allegro.h>
#include<iostream>
using std::cout;

int speed = 0;
void fs()
{
    speed = 1;
};
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 1680, 1050, 0, 0 );
    set_pallete( default_palette );
   
    BITMAP * bufor = create_bitmap( 1680, 1050 );
    BITMAP * mapa = load_bitmap( "xxx.bmp", default_palette );
    BITMAP * gosc = load_bitmap( "gosc.bmp", default_palette );
    BITMAP * kursor = load_bitmap( "grafika/inne/kursor.bmp", default_palette );
    BITMAP * kula = load_bitmap( "grafika/inne/kula.bmp", default_palette );
   
    install_timer();
    install_int_ex( fs, BPS_TO_TIMER( 8 ) );
    reserve_voices( 64, 64 );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
   
    SAMPLE * dzwiek = load_sample( "m1.wav" );
    SAMPLE * pioszenka = load_sample( "pioszenka.wav" );
   
    install_mouse();
    unscare_mouse();
    int a = SCREEN_W / 2, b = SCREEN_H / 2;
    float sx = 0, sy = 0;
    float kat = 0;
    float bok_a, bok_b;
    int mysz_x, mysz_y;
    bool click = false;
    float ammo[ 1000 ][ 5 ];
    int al = 0;
    int odrzut = 0;
    int szybkosc = 8;
    for( int q = 0; q < 1000; q++ )
    {
        ammo[ q ][ 0 ] = 0; //aktualna pozycja x
        ammo[ q ][ 1 ] = 0; // y
        ammo[ q ][ 2 ] = 0; // o ile ma sie ruszyc x
        ammo[ q ][ 3 ] = 0; // y
        ammo[ q ][ 4 ] = 0; // jaki kat kuli
    }
    srand( time( 0 ) );
   
    int S = 10; // szybkosc lotu kuli
    play_sample( pioszenka, 255, 127, 1000, 0 );
    //=========================================
    while( !key[ KEY_ESC ] )
    {
       
        mysz_x = mouse_x + kursor->w / 2;
        mysz_y = mouse_y + kursor->h / 2;
       
        blit( mapa, bufor, 0, 0, 0, 0, mapa->w, mapa->h );
       
        bok_a = mysz_x - a;
        bok_b = b - mysz_y;
        //==================KAT======================
        kat = 45 *( bok_a / bok_b );
        if( kat > 45 || kat < 0 )
        {
            kat = 45;
            kat += 45 - 45 *( bok_b / bok_a );
            if( kat > 90 || kat < 0 )
            {
                kat = 90;
                kat += 45 *( -( bok_b ) / bok_a );
                if( kat < 0 || kat > 135 )
                {
                    kat = 135;
                    kat += 45 - 45 *( bok_a /-( bok_b ) );
                }
            }
        }
        if( mysz_x < a )
             kat += 180;
       
        if( mysz_x == a && mysz_y > b )
             kat = 180;
        //==================LOT KULI=======================
        for( int q = 0; q < 1000; q++ )
        {
            if(( ammo[ q ][ 0 ] > 0 && ammo[ q ][ 0 ] < SCREEN_W ) ||( ammo[ q ][ 1 ] > 0 && ammo[ q ][ 1 ] < SCREEN_H ) )
            {
                ammo[ q ][ 0 ] += ammo[ q ][ 2 ];
                ammo[ q ][ 1 ] += ammo[ q ][ 3 ];
                rotate_sprite( bufor, kula, ammo[ q ][ 0 ], ammo[ q ][ 1 ], ftofix( ammo[ q ][ 4 ] * 255 / 360 ) );
            }
        }
        //============================================
        //  cout<<"x =  "<<sx<<", "<<wx<<" || y = "<<sy<<", "<<wy<<"\n";
        cout << odrzut << ", " << al << "\n";
        if( key[ KEY_A ] )
        {
            szybkosc++;
            if( szybkosc > 500 )
                 szybkosc = 500;
           
        }
        if( key[ KEY_Z ] )
        {
            szybkosc--;
            if( szybkosc < 1 )
                 szybkosc = 1;
           
        }
        //====================STRZAŁ=========================
        if( mouse_b == 1 /*&&click==false*/ && speed > 0 )
        {
            ammo[ al ][ 0 ] = a;
            ammo[ al ][ 1 ] = b;
            ammo[ al ][ 4 ] = kat;
            sy = mysz_y - b;
            sx = mysz_x - a;
            if( odrzut != 0 )
            {
                sy +=( rand() % odrzut ) - odrzut / 2;
                sx +=( rand() % odrzut ) - odrzut / 2;
            }
           
            if(( ammo[ al ][ 4 ] >= 0 && ammo[ al ][ 4 ] <= 45 ) ||( ammo[ al ][ 4 ] > 315 && ammo[ al ][ 4 ] <= 360 ) )
            {
                ammo[ al ][ 3 ] =- S;
                ammo[ al ][ 2 ] = S * sx /-( sy );
            }
            if( ammo[ al ][ 4 ] > 45 && ammo[ al ][ 4 ] <= 135 )
            {
                ammo[ al ][ 2 ] = S;
                ammo[ al ][ 3 ] = S * sy / sx;
            }
            if( ammo[ al ][ 4 ] > 135 && ammo[ al ][ 4 ] <= 225 )
            {
                ammo[ al ][ 2 ] = S * sx / sy;
                ammo[ al ][ 3 ] = S;
            }
            if( ammo[ al ][ 4 ] > 225 && ammo[ al ][ 4 ] <= 315 )
            {
                ammo[ al ][ 2 ] =- S;
                ammo[ al ][ 3 ] = S * sy /-( sx );
            }
           
            click = true;
            al++;
            if( al == 1000 )
                 al = 0;
           
            odrzut += 20;
            if( odrzut > 80 )
                 odrzut = 80;
           
            speed--;
            play_sample( dzwiek, 100, 127, 1000, 0 );
        }
        //==============================================
        /* if(mouse_b!=1)
            click=false;
        */
        if( key[ KEY_UP ] )
             b--;
       
        if( key[ KEY_DOWN ] )
             b++;
       
        if( key[ KEY_LEFT ] )
             a--;
       
        if( key[ KEY_RIGHT ] )
             a++;
       
        rotate_sprite( bufor, gosc, a - gosc->w / 2, b - gosc->h / 2, ftofix( kat * 255 / 360 ) );
        rectfill( bufor, 10, 10, 200, 35, makecol( 128, 30, 30 ) );
        textprintf_ex( bufor, font, 20, 20, makecol( 255, 255, 0 ), - 1, "SZYBKOSTRZELNOSC - %i", szybkosc );
        masked_blit( kursor, bufor, 0, 0, mysz_x, mysz_y, kursor->w, kursor->h );
        blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
        clear_keybuf();
        odrzut -= 1;
        if( odrzut < 0 )
             odrzut = 0;
       
        install_int_ex( fs, BPS_TO_TIMER( szybkosc ) );
    }
   
    destroy_bitmap( bufor );
    destroy_bitmap( kursor );
    destroy_bitmap( mapa );
    destroy_bitmap( gosc );
    destroy_bitmap( kula );
    destroy_sample( dzwiek );
    destroy_sample( pioszenka );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-26827
DejaVu
» 2011-01-22 14:32:26
http://www.allegro.cc/forums/thread/590131
W powyższym temacie odbyła się dyskusja na temat dźwięku - ociera się również o problem, który Ty masz.

/edit2:
Prawdopodobne rozwiązanie:
http://www.allegro.cc/manual/4/api/digital-sample-routines /voice-control/voice_set_priority

/edit3:
A tu lista funkcji związanych z dźwiękiem:
http://www.allegro.cc/manual/4/api/digital-sample-routines/
P-26829
dmx81
» 2011-01-23 00:30:22
pozno juz i zle chyba widze, ale nie widze timerow, a gdzies pod koniec kodu zmniejszasz
C/C++
speed--
// a nie masz petli
while( speed > 0 )
 chyba ze cos przeoczylem lub jakos inaczej sobie to rozwiazales

nie wiem ile trwa dzwiek wystrzalu u ciebie, moze warto go troszke opoznic, tzn zalaczanie sie jeden po drugim (bo jesli nie masz timerow, to leca naprawde seryjnie i sie zapycha miejsce tych 64 dzwiekow)
mozna dac np
C/C++
int licznik_1 = 0;
//kod wystrzalu
if( licznik > 10 )
{
    play_sample();
    licznik = 0;
}
else licznik++;

 mniej wiecej cos takiego

to 10 to moze byc 100, 5, cokolwiek - zalezy od dlugosci dzwieku i od szybkosci komputera (ew. od ustawionego timera)


P-26889
« 1 » 2
  Strona 1 z 2 Następna strona