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

Problem z animacją

Ostatnio zmodyfikowano 2012-03-28 22:24
Autor Wiadomość
hakr1921
Temat założony przez niniejszego użytkownika
Problem z animacją
» 2012-03-28 20:46:58
A więc tak, chciałem robić wszystko według poradnika lecz niestety, mój kod jest inny niż części poradnika i
nie wiem jak za bardzo ogarnąć to
C/C++
if( frame < 20 ) { draw_sprite( bufor, ludek0, ludek_x, ludek_y ); }
else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek1, ludek_x, ludek_y ); }
else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek2, ludek_x, ludek_y ); }
else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek3, ludek_x, ludek_y ); }

Mój kod

C/C++
//===================================================================================================
class Cpostac
{
public:
    short int x, y;
    short int s, w;
};

bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else return false;
   
};
bool kolizjaprawo( int x1, int y1, int s1, int w1 )
{
    if( x1 > 603 ) return true;
    else return false;
   
};
bool kolizjadol( int x1, int y1, int s1, int w1 )
{
    if( y1 > 445 ) return true;
    else return false;
   
};
bool kolizjalewo( int x1, int y1, int s1, int w1 )
{
    if( x1 < 0 ) return true;
    else return false;
   
};
bool kolizjagora( int x1, int y1, int s1, int w1 )
{
    if( y1 < 0 ) return true;
    else return false;
   
};

Cpostac ludek1, ludek2;
//===================================================================================================
#include <allegro.h>

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );

LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );


int main()
{
    double przys = 1;
    int frame = 0;
   
    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( 250 ) );
   
    BITMAP * bufor = NULL;
    BITMAP * ludekb1 = NULL;
    BITMAP * ludekb12 = NULL;
    BITMAP * ludekb13 = NULL;
    BITMAP * ludekb14 = NULL;
    BITMAP * ludekb2 = NULL;
   
    bufor = create_bitmap( 640, 480 );
    ludekb1 = load_bmp( "ludekb1.bmp", default_palette );
    ludekb12 = load_bmp( "ludekb12.bmp", default_palette );
    ludekb13 = load_bmp( "ludekb13.bmp", default_palette );
    ludekb14 = load_bmp( "ludekb14.bmp", default_palette );
    ludekb2 = load_bmp( "ludekb2.bmp", default_palette );
   
    ludek1.x = 100; ludek1.y = 100; ludek1.s = 40; ludek1.w = 40;
    ludek2.x = 300; ludek2.y = 100; ludek2.s = 40; ludek2.w = 40;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) ludek1.x--, ludek1.x -= przys;
           
            if( key[ KEY_RIGHT ] ) ludek1.x++, ludek1.x += przys;
           
            if( key[ KEY_UP ] ) ludek1.y--, ludek1.y -= przys;
           
            if( key[ KEY_DOWN ] ) ludek1.y++, ludek1.y += przys;
           
            if( ludek1.x > ludek2.x ) ludek2.x++;
           
            if( ludek1.x < ludek2.x ) ludek2.x--;
           
            if( ludek1.y > ludek2.y ) ludek2.y++;
           
            if( ludek1.y < ludek2.y ) ludek2.y--;
           
           
            speed--;
            frame++;
            if( frame > 80 ) frame = 0;
           
           
        }
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        if( frame < 20 ) { draw_sprite( bufor, ludekb1, ludek1.x, ludek1.y ); }
        if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludekb12, ludek.x, ludek1.y ); }
        if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludekb13, ludek.x, ludek1.y ); }
        if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludekb14, ludek.x, ludek1.y ); }
       
        masked_blit( ludekb1, bufor, 0, 0, ludek1.x, ludek1.y, ludek1.s, ludek1.w );
        masked_blit( ludekb2, bufor, 0, 0, ludek2.x, ludek2.y, ludek2.s, ludek2.w );
       
        if( kolizja( ludek1.x, ludek1.y, ludek1.s, ludek1.w, ludek2.x, ludek2.y, ludek2.s, ludek2.w ) == true )
        { ludek2.x = 50, ludek2.y = 50; }
       
        if( kolizjaprawo( ludek1.x, ludek1.y, ludek1.s, ludek1.w ) == true )
        { speed--, ludek1.x--; }
       
        if( kolizjadol( ludek1.x, ludek1.y, ludek1.s, ludek1.w ) == true )
        { speed--, ludek1.y--; }
       
        if( kolizjalewo( ludek1.x, ludek1.y, ludek1.s, ludek1.w ) == true )
        { speed--, ludek1.x++; }
       
        if( kolizjagora( ludek1.x, ludek1.y, ludek1.s, ludek1.w ) == true )
        { speed--, ludek1.y++; }
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
       
    }
    destroy_bitmap( ludekb12 );
    destroy_bitmap( ludekb13 );
    destroy_bitmap( ludekb14 );
    destroy_bitmap( bufor );
    destroy_bitmap( ludekb1 );
    destroy_bitmap( ludekb2 );
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();
//===================================================================================================
P-53409
Chlorek
» 2012-03-28 21:04:08
Przede wszystkim musisz zacząć od zrozumienia kodu animacji. Ten sposób jest bardzo prosty. Masz zmienną, do której co chwile jest dodawane 1. Gdy jest pomiędzy ileś, a ileś to wtedy zmień obrazek, gdy osiągnie jakiś limit to zeruje się i tak w kółko.
P-53410
hakr1921
Temat założony przez niniejszego użytkownika
» 2012-03-28 21:44:58
Ogólnie wiem o co chodzi tylko nie ogarniam tego z moim kodem
P-53411
SeaMonster131
» 2012-03-28 22:24:19
A co tu ogarniać? » Kurs C++ » Poziom 1Instrukcja warunkowa if ... else lekcja i lecisz :)

Po prostu w zależności od wartości zmiennej frame, wyświetlasz odpowiednią bitmapę - w tym przypadku klatkę. I te wyświetlanie różnych klatek, daje nam animację.

// Tylko daj zamiast
if( frame > 80 ) frame = 0;
 to
if( frame >= 80 ) frame = 0;
 (>=), żeby nie było żadnej przerwy pomiędzy ostatnią a pierwszą klatką.
P-53413
« 1 »
  Strona 1 z 1