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

Alllegro - ciekawy problem

Ostatnio zmodyfikowano 2009-12-31 18:37
Autor Wiadomość
marcin49
Temat założony przez niniejszego użytkownika
Alllegro - ciekawy problem
» 2009-12-31 11:04:03
Witam, jestem nowy użytkownikiem, więc prosiłbym o wyrozumiałość.
Otóż piszę grę w allegro i mam dość ciekawy problem

Otóż chce zrobić walkę z przeciwnikiem, i zrobiłem coś takiego że jak zbliżysz się postacią do przeciwnika to uruchamia się walka i zabiera mi życia. I niby wszystko powinno być ok, ale jak poczekam kilka sekund w miejscu i podejdziesz potem do gościa to nagle robi się mało życia.

Oto kod:

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

volatile long speed = 0;

void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );

LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Walka
volatile long walka = 0;

void increment_walka()
{
    walka++;
}
END_OF_FUNCTION( increment_walka );

LOCK_VARIABLE( walka );
LOCK_FUNCTION( increment_walka );

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
   
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 70 ) );
    install_int_ex( increment_walka, BPS_TO_TIMER( 5 ) );
   
    BITMAP * ludek = NULL;
    BITMAP * przeciwnik = NULL;
    BITMAP * bufor = NULL;
   
    ludek = load_bitmap( "ludek.bmp", default_palette );
    przeciwnik = load_bmp( "przeciwnik.bmp", default_palette );
    bufor = create_bitmap( 640, 480 );
   
    int ludek_x = 300, ludek_y = 300;
    int przeciwnik_x = 500, przeciwnik_y = 300;
   
    int zycie = 50;
    int zycie1 = 30;
   
   
    bool bitwa = false;
   
    while( !key[ KEY_ESC ] ) {
       
        if( przeciwnik_x - ludek_x < 30 ) bitwa = true;
       
       
        if( przeciwnik_x - ludek_x > 30 ) bitwa = false;
       
        while( speed > 0 ) {
           
            if( key[ KEY_LEFT ] ) ludek_x--;
           
            if( key[ KEY_RIGHT ] ) ludek_x++;
           
            if( key[ KEY_UP ] ) ludek_y--;
           
            if( key[ KEY_DOWN ] ) ludek_y++;
           
            speed--;
        }
       
        if( bitwa == true ) {
            while( walka > 0 ) {
               
                // walka
                if( bitwa == true ) zycie--;
               
                walka--;
            }
        }
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        textprintf_ex( bufor, font, ludek_x, ludek_y - 10, makecol( 0, 0, 0 ), - 1, "%d", zycie );
        textprintf_ex( bufor, font, przeciwnik_x, przeciwnik_y - 10, makecol( 0, 0, 0 ), - 1, "%d", zycie1 );
       
       
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
        masked_blit( przeciwnik, bufor, 0, 0, przeciwnik_x, przeciwnik_y, przeciwnik->w, przeciwnik->h );
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
   
    remove_int( increment_speed );
    remove_int( increment_walka );
   
    destroy_bitmap( ludek );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

A tu plik .exe  : http://uploading.com/files/7aa4343d/Przyk%25C5%2582ad.exe/

Proszę o pomoc.
P-12583
malan
» 2009-12-31 11:42:14
Sprawdź to:
C/C++
if( bitwa == true ) {
    if( walka > 0 ) {
       
        // walka
        if( bitwa == true ) zycie--;
       
        walka--;
    }
}
P-12584
marcin49
Temat założony przez niniejszego użytkownika
» 2009-12-31 11:50:17
Moim zdaniem tu jest wszystko dobrze. :(
P-12586
malan
» 2009-12-31 11:56:23
Moim zdaniem nie jest, ale mogę się mylić ;).
Zauważyłeś, że zmieniłem trochę ten kod?
  if ( walka> 0)
P-12587
DejaVu
» 2009-12-31 18:37:12
Ktoś miał podobny problem z czymś innym. Chodzi o to, że timer'a powinieneś zainicjować od walki w chwili zbliżenia na walka = 0;
P-12607
« 1 »
  Strona 1 z 1