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

Problem z Programem z Allegro.

Ostatnio zmodyfikowano 2009-12-13 17:12
Autor Wiadomość
KrQ
Temat założony przez niniejszego użytkownika
Problem z Programem z Allegro.
» 2009-12-13 00:13:51
Mój Problem polega na tym że przy tak zdefiniowanej funkcji głównej:

C/C++
int main() {
    init();
   
    menu();
   
    poziom1();
   
    deinit();
    return 0;
   
}
END_OF_MAIN()

Po Przejsciu z Funkcji Menu Do Funkcji Poziom1 okazuje się że funkcja poziom1 wykonuje algorytmy zapisane w niej przed zakończeniem funkcji menu. Prowadzi to do tego że mój kolorowy bochater często zostaje zjedzony przez kulkę zanim użytkownik zdąży przejąć nad nim kontrole. JAK TO ROZWIĄZAĆ? (wszystkie funkcje sa zdefiniowane w tym samym pliku).
P-12133
DejaVu
» 2009-12-13 00:48:57
W programowaniu nic się nie dzieje przypadkowo. Podany fragment nic nam nie mówi poza tym, że kod wykona się w 100% sekwencyjnie jeśli nie utworzyłeś świadomie nowych procesów wewnątrz tych funkcji. Na pewno w przytoczonym fragmencie kodu nie leży przyczyna Twojego problemu.
P-12134
KrQ
Temat założony przez niniejszego użytkownika
» 2009-12-13 01:01:55
W takim razie tu jest cały kod:

C/C++
#include <allegro.h>
#include <cmath>
#include <conio.h>


void init();
void deinit();
void increment_speed();

int menu();
int poziom1();
int test = 0;
int pkt = 1;
int frame = 0;
volatile long speed = 0;
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );


int main() {
    init();
   
    menu();
   
    poziom1();
   
    deinit();
    return 0;
   
}
END_OF_MAIN()

void init() {
    int depth, res;
    allegro_init();
    depth = desktop_color_depth();
    if( depth == 0 ) depth = 32;
   
    set_color_depth( depth );
    res = set_gfx_mode( GFX_AUTODETECT_WINDOWED, 400, 400, 0, 0 );
    if( res != 0 ) {
        allegro_message( allegro_error );
        exit( - 1 );
    }
    clear_to_color( screen, makecol( 128, 128, 128 ) );
    install_timer();
    install_keyboard();
    install_mouse();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
    /* add other initializations here */
}


void deinit() {
    clear_keybuf();
   
}


void increment_speed()
{
    speed++;
}

int menu()
{
   
   
    BITMAP * bufor = NULL;
    bufor = create_bitmap( 400, 400 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc bufora !" );
        allegro_exit();
        return 0;
    }
   
   
   
    BITMAP * tlomenu = NULL;
    tlomenu = load_bmp( "podklad.bmp", default_palette );
    if( !tlomenu )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        ( "nie moge zaladowac obrazka podklad !" );
        allegro_exit();
        return 0;
    }
   
    BITMAP * logo = NULL;
    logo = load_bmp( "logo.bmp", default_palette );
    if( !logo )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie moge zaladowac obrazka logo !" );
        allegro_exit();
        return 0;
    }
    while( !key[ KEY_ENTER ] ) {
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
       
        blit( tlomenu, bufor, 0, 0, 0, 0, 400, 400 );
        masked_blit( logo, bufor, 0, 0, 100, 10, logo->w, logo->h );
        textprintf( bufor, font, 120, 200, makecol( 255, 255, 128 ), "PRESS ENTER TO START" );
        blit( bufor, screen, 0, 0, 0, 0, 400, 400 );
       
    }
   
    destroy_bitmap( tlomenu );
    destroy_bitmap( logo );
    destroy_bitmap( bufor );
    return 0;
}





int poziom1()
{
   
   
   
    while( !key[ KEY_ESC ] ) {
        BITMAP * bufor = NULL;
        bufor = create_bitmap( 400, 400 );
        if( !bufor )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "Nie moge utworzyc bufora !" );
            allegro_exit();
            return 0;
        }
       
        BITMAP * ludek = NULL;
        ludek = load_bmp( "kwadrat.bmp", default_palette );
        if( !ludek )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka Ludek !" );
            allegro_exit();
            return 0;
        }
       
        BITMAP * kropek = NULL;
        kropek = load_bmp( "kropek.bmp", default_palette );
        if( !kropek )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka Kropek !" );
            allegro_exit();
            return 0;
        }
       
        BITMAP * kropek1 = NULL;
        kropek1 = load_bmp( "kropek.bmp", default_palette );
        if( !kropek1 )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka Kropek1 !" );
            allegro_exit();
            return 0;
        }
       
        BITMAP * kropek2 = NULL;
        kropek2 = load_bmp( "kropek.bmp", default_palette );
        if( !kropek2 )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka Kropek2 !" );
            allegro_exit();
            return 0;
        }
       
        BITMAP * kropek3 = NULL;
        kropek3 = load_bmp( "kropek.bmp", default_palette );
        if( !kropek3 )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka Kropek3 !" );
            allegro_exit();
            return 0;
        }
       
       
        BITMAP * tlo1 = NULL;
        tlo1 = load_bmp( "tlo1.bmp", default_palette );
        if( !tlo1 )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka tlo1 !" );
            allegro_exit();
            return 0;
        }
       
        BITMAP * tlo2 = NULL;
        tlo2 = load_bmp( "tlo2.bmp", default_palette );
        if( !tlo2 )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac obrazka tlo2 !" );
            allegro_exit();
            return 0;
        }
       
       
       
       
        MIDI * dzwiek = NULL;
        dzwiek = load_midi( "kropki.mid" );
        if( !dzwiek )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac dzwieku !" );
            allegro_exit();
            return 0;
        }
       
        SAMPLE * dzwiek1 = NULL;
        dzwiek1 = load_sample( "omom.wav" );
        if( !dzwiek1 )
        {
            set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
            allegro_message( "nie moge zaladowac dzwieku1 !" );
            allegro_exit();
            return 0;
        }
       
        int kropek_x = 0, kropek_y = 0;
        int kropek1_x = 350, kropek1_y = 350;
        int kropek2_x = 0, kropek2_y = 350;
        int kropek3_x = 350, kropek3_y = 0;
        int ludek_x = 200, ludek_y = 200;
       
       
        play_midi( dzwiek, 1 );
        play_sample( dzwiek1, 255, 127, 800, 1 );
       
        while( !key[ KEY_ESC ] )
        {
           
           
            while( speed > 0 )
            {
                if( key[ KEY_LEFT ] ) ludek_x = ludek_x - 2;
               
                if( key[ KEY_LEFT ] && ludek_x < 0 ) ludek_x = ludek_x + 2;
               
                if( key[ KEY_RIGHT ] ) ludek_x = ludek_x + 2;
               
                if( key[ KEY_RIGHT ] && ludek_x > 350 ) ludek_x = ludek_x - 2;
               
                if( key[ KEY_UP ] ) ludek_y = ludek_y - 2;
               
                if( key[ KEY_UP ] && ludek_y < 0 ) ludek_y = ludek_y + 2;
               
                if( key[ KEY_DOWN ] ) ludek_y = ludek_y + 2;
               
                if( key[ KEY_DOWN ] && ludek_y > 350 ) ludek_y = ludek_y - 2;
               
                //rest(1);
               
                if( ludek_x - kropek_x < 0 ) kropek_x = kropek_x - 1;
               
                if( ludek_x - kropek_x > 0 ) kropek_x = kropek_x + 1;
               
                if( ludek_y - kropek_y < 0 ) kropek_y = kropek_y - 1;
               
                if( ludek_y - kropek_y > 0 ) kropek_y = kropek_y + 1;
               
                frame++;
                if( frame > 60 ) frame = 0;
               
                if( pkt > 100 )
                {
                    if( pkt == 101 ) play_sample( dzwiek1, 255, 150, 900, 1 );
                   
                    if( ludek_x - kropek1_x < 0 ) kropek1_x = kropek1_x - 1;
                   
                    if( ludek_x - kropek1_x > 0 ) kropek1_x = kropek1_x + 1;
                   
                    if( ludek_y - kropek1_y < 0 ) kropek1_y = kropek1_y - 1;
                   
                    if( ludek_y - kropek1_y > 0 ) kropek1_y = kropek1_y + 1;
                   
                    if( abs( ludek_x - kropek1_x ) < 30 && abs( ludek_y - kropek1_y ) < 30 )
                    {
                        destroy_bitmap( kropek );
                        destroy_bitmap( kropek1 );
                        destroy_bitmap( kropek2 );
                        destroy_bitmap( kropek3 );
                        destroy_sample( dzwiek1 );
                        destroy_midi( dzwiek );
                        destroy_bitmap( ludek );
                        destroy_bitmap( bufor );
                        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
                        allegro_message( "GAME OVER" );
                        allegro_exit();
                        return 0;
                    }
                }
               
                if( pkt > 200 )
                {
                    if( pkt == 201 ) play_sample( dzwiek1, 255, 127, 700, 1 );
                   
                    if( ludek_x - kropek2_x < 0 ) kropek2_x = kropek2_x - 1;
                   
                    if( ludek_x - kropek2_x > 0 ) kropek2_x = kropek2_x + 1;
                   
                    if( ludek_y - kropek2_y < 0 ) kropek2_y = kropek2_y - 1;
                   
                    if( ludek_y - kropek2_y > 0 ) kropek2_y = kropek2_y + 1;
                   
                    if( abs( ludek_x - kropek2_x ) < 30 && abs( ludek_y - kropek2_y ) < 30 )
                    {
                        destroy_bitmap( kropek );
                        destroy_bitmap( kropek1 );
                        destroy_bitmap( kropek2 );
                        destroy_bitmap( kropek3 );
                        destroy_sample( dzwiek1 );
                        destroy_midi( dzwiek );
                        destroy_bitmap( ludek );
                        destroy_bitmap( bufor );
                        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
                        allegro_message( "GAME OVER" );
                        allegro_exit();
                        return 0;
                    }
                }
                if( pkt > 300 )
                {
                    if( pkt == 301 ) play_sample( dzwiek1, 255, 127, 600, 1 );
                   
                    if( ludek_x - kropek3_x < 0 ) kropek3_x = kropek3_x - 1;
                   
                    if( ludek_x - kropek3_x > 0 ) kropek3_x = kropek3_x + 1;
                   
                    if( ludek_y - kropek3_y < 0 ) kropek3_y = kropek3_y - 1;
                   
                    if( ludek_y - kropek3_y > 0 ) kropek3_y = kropek3_y + 1;
                   
                    if( abs( ludek_x - kropek3_x ) < 30 && abs( ludek_y - kropek3_y ) < 30 )
                    {
                        destroy_bitmap( kropek );
                        destroy_bitmap( kropek1 );
                        destroy_bitmap( kropek2 );
                        destroy_bitmap( kropek3 );
                        destroy_midi( dzwiek );
                        destroy_sample( dzwiek1 );
                        destroy_bitmap( ludek );
                        destroy_bitmap( bufor );
                        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
                        allegro_message( "GAME OVER" );
                        allegro_exit();
                        return 0;
                    }
                }
               
                speed--;
                pkt++;
               
                if( abs( ludek_x - kropek_x ) < 30 && abs( ludek_y - kropek_y ) < 30 )
                {
                    destroy_bitmap( kropek );
                    destroy_bitmap( kropek1 );
                    destroy_bitmap( kropek2 );
                    destroy_bitmap( kropek3 );
                   
                    destroy_sample( dzwiek1 );
                    destroy_midi( dzwiek );
                    destroy_bitmap( ludek );
                    destroy_bitmap( bufor );
                    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
                    allegro_message( "GEJM OWER" );
                    allegro_exit();
                    return 0;
                }
               
            }
           
           
            clear_to_color( bufor, makecol( 150, 150, 150 ) );
            //rest(1);
            if( frame > 30 ) blit( tlo1, bufor, 0, 0, 0, 0, 400, 400 );
           
            if( frame <= 30 ) blit( tlo2, bufor, 0, 0, 0, 0, 400, 400 );
           
            textprintf( bufor, font, 20, 20, makecol( 255, 255, 128 ), "PKT : %d", pkt );
            masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
            masked_blit( kropek, bufor, 0, 0, kropek_x, kropek_y, kropek->w, kropek->h );
            if( pkt > 100 ) masked_blit( kropek1, bufor, 0, 0, kropek1_x, kropek1_y, kropek1->w, kropek1->h );
           
            if( pkt > 200 ) masked_blit( kropek2, bufor, 0, 0, kropek2_x, kropek2_y, kropek2->w, kropek2->h );
           
            if( pkt > 300 ) masked_blit( kropek3, bufor, 0, 0, kropek3_x, kropek3_y, kropek3->w, kropek3->h );
           
            blit( bufor, screen, 0, 0, 0, 0, 400, 400 );
        }
       
        destroy_bitmap( kropek );
        destroy_bitmap( kropek1 );
        destroy_bitmap( kropek2 );
        destroy_bitmap( kropek3 );
        destroy_midi( dzwiek );
        destroy_sample( dzwiek1 );
        destroy_bitmap( ludek );
        destroy_bitmap( bufor );
        return 0;
       
    }
   
}
P-12135
DejaVu
» 2009-12-13 03:12:00
Masz 3 pętle while w poziom1() czy coś takiego. Zapewne za dużo o tą pierwszą. Być może w tym problem leży, a być może w czymś innym. Problem jest zbyt ogólnie opisany, a kompilować kodu mi się nie chce nie mając obrazków.

/edit:
A jeśli chodzi Ci o zamrożenie ekranu na kilka sekund po uruchomieniu poziomu to utwórz zmienną bool i ustaw ją na początku np. na true. po wyświetleniu wszystkiego na ekran dopisz jeszcze warunek:
C/C++
if( bPoczatek )
{
    rest( 3000 );
    bPoczatek = false;
}
P-12136
KrQ
Temat założony przez niniejszego użytkownika
» 2009-12-13 03:34:41
Nie chodzi o zamrożenie ekranu, chodzi o to że te dwa procesy (niemam pojęcia jak to możliwe bo przeczy to wszystkiemu co widziałem na oczy) działają równolegle O.o Usunięcie pierwszej pętli nic nie zmienia w działaniu programu (co znaczy że była zbędna) a wstawienie takiej pauzy, jest rozwiązaniem które zatrzymuje mi działanie programu już w menu (stąd ten wcześniejszy wniosek) tu link do skompilowanego dzieła : http://wieik.info/13/Krwiozercze Kropki DEMO.rar  (tak wiem spacje w linku, to magia że działa)
P-12137
DejaVu
» 2009-12-13 04:24:16
Po pierwsze: Nie widzę tutaj problemu który opisujesz. Po drugie: Nie wpisałeś tego co napisałem w odpowiedniej funkcji. Po trzecie: ten program jest w 100% sekwencyjny (pomijając muzykę i timer'a).
P-12138
KrQ
Temat założony przez niniejszego użytkownika
» 2009-12-13 12:54:28
Ani w przypadku gry wpisuje tą pauze w menu ani poziom1 nie rozwiazuje to mojego problemu. Zastanawia mnie natomiast kwestia tego że niezauważyłeś tego problemu, więc u mnie gdy włączymy program i odczekamy ok 10 sekund w menu, po nacisnięciu entera wyświetli się tylko GAME OVER natomiast gdy wcisniesz enter wczesniej, widać że kółka znajdują się w innej pozycji niż startowa,

Kompilowałeś program samemu? może to wina kompilatora?
P-12141
DejaVu
» 2009-12-13 15:54:24
Teraz jasno opisałeś problem. Chodzi o timera. Ustaw mu wartość początkową w poziom1().
P-12146
« 1 » 2
  Strona 1 z 2 Następna strona