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

[Allegro] Bufory

Ostatnio zmodyfikowano 2009-05-19 23:30
Autor Wiadomość
Camper
Temat założony przez niniejszego użytkownika
[Allegro] Bufory
» 2009-05-17 19:35:42
Witam.
Poczytałem trochę po forum i dowiedziałem się pewnych rzeczy, jednak że nadal mam problemy.
Otóż, piszę grę, na razie polega na tym że są 2 statki, 1 steruje się na wsad, drugim na strzałkach, do tego się strzela i jak się trafia to generuje dźwięk.
Dosyć prosty jednak mam problemy z płynnością gry, czy moglibyście mi powiedzieć jak powinno wyglądać rozłożenie na bufory ?
Otóż chodzi mi o tło <-mruga jak strzelam
statki też mrugają jak strzelam,
Chcę wiedzieć jak umieścić na buforach strzały, statki, tło ponieważ nie chodzi to płynnie.

Następny problem sprawiało poruszanie się w trakcie strzału, otóż jak strzał leciał to x i y statku się zmieniały ale nie wyświetlało tego bo było na etapie pętli wyświetlania strzału, dopiero po tym jak strzał znikał, statek pojawiał się w miejscu gdzie powinien być. (wymyśliłem że dam sterowanie do tej pętli ale to chyba nie zbyt dobre rozwiązanie bo teraz jak lecę i strzelam to przy strzale robi przeskok i pojawia się dalej)

to fragment kodu który prawdopodobnie stwarza problemy : (jestem bardzo początkujący[2 dni] i dlatego tam taki bałagan.)

C/C++
while( !key[ KEY_ESC ] )
{
    frame++;
    if( frame > 40 ) frame = 0;
   
    while( speed > 0 )
    {
        if( key[ KEY_A ] ) enemy_x = enemy_x - 11;
       
        if( key[ KEY_D ] ) enemy_x = enemy_x + 11;
       
        if( key[ KEY_W ] ) enemy_y = enemy_y - 11;
       
        if( key[ KEY_S ] ) enemy_y = enemy_y + 11;
       
        if( key[ KEY_C ] ) {
            int strzal_x = enemy_x + 10, strzal_y = enemy_y + 10, strzal_s = 25, strzal_w = 25;
           
            while( strzal_y < 600 ) {
                if( key[ KEY_A ] ) enemy_x = enemy_x - 11;
               
                if( key[ KEY_D ] ) enemy_x = enemy_x + 11;
               
                if( key[ KEY_W ] ) enemy_y = enemy_y - 11;
               
                if( key[ KEY_S ] ) enemy_y = enemy_y + 11;
               
                if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); }
                else { draw_sprite( bufor2, bmp, 0, 0 ); }
               
                if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
                else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
               
                if( frame < 20 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); }
                else { draw_sprite( bufor2, statek, statek_x, statek_y ); }
               
                if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
                else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
               
                blit( bufor2, screen, 0, 0, 0, 0, 800, 600 );
                strzal_y = strzal_y + 10;
                clear_to_color( bufor2, makecol( 150, 150, 150 ) );
               
                if( kolizja( statek_x, statek_y, statek_s, statek_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true )
                { play_sample( dzwiek, 255, 127, 3000, 0 ); } } }
       
        if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
       
        if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
       
        if( key[ KEY_UP ] ) statek_y = statek_y - 2;
       
        if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;
       
        if( key[ KEY_M ] ) {
           
            int strzal_x = statek_x + 10, strzal_y = statek_y + 10, strzal_s = 25, strzal_w = 25;
           
            while( strzal_y > 1 )
            {
                if( key[ KEY_A ] ) enemy_x = enemy_x - 11;
               
                if( key[ KEY_D ] ) enemy_x = enemy_x + 11;
               
                if( key[ KEY_W ] ) enemy_y = enemy_y - 11;
               
                if( key[ KEY_S ] ) enemy_y = enemy_y + 11;
               
                if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); }
                else { draw_sprite( bufor2, bmp, 0, 0 ); }
               
                if( frame < 40 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); }
                else { draw_sprite( bufor2, statek, statek_x, statek_y ); }
               
                if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
                else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
               
                if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
                else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
               
                blit( bufor2, screen, 0, 0, 0, 0, 800, 600 );
                clear_to_color( bufor2, makecol( 150, 150, 150 ) );
                strzal_y = strzal_y - 10;
               
                if( kolizja( enemy_x, enemy_y, enemy_s, enemy_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true )
                { play_sample( dzwiek, 255, 127, 3000, 0 ); }
               
                if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
               
                if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
               
                if( key[ KEY_UP ] ) statek_y = statek_y - 2;
               
                if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; } }
       
       
       
       
        speed--;
    }
   
    clear_to_color( bufor, makecol( 255, 0, 255 ) );
   
    if( enemy_x < 0 ) { enemy_x = 800; }
    if( enemy_y < 0 ) { enemy_y = 600; }
    if( enemy_x > 800 ) { enemy_x = 0; }
    if( enemy_y > 600 ) { enemy_y = 0; }
    if( statek_x < 0 ) { statek_x = 800; }
    if( statek_y < 0 ) { statek_y = 600; }
    if( statek_x > 800 ) { statek_x = 0; }
    if( statek_y > 600 ) { statek_y = 0; }
    if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); }
    else { draw_sprite( bufor, bmp, 0, 0 ); }
    if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
    else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
    if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); }
    else { draw_sprite( bufor, statek, statek_x, statek_y ); }
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); }
P-6970
DejaVu
» 2009-05-17 19:55:23
Czemu masz dwa bufory: bufor i bufor2?
P-6972
Camper
Temat założony przez niniejszego użytkownika
» 2009-05-17 20:12:50
pomyślałem że zrobię to na oddzielnych buforach żeby nie mrugało.

@edit
zrobiłem na tym samym buforze i teraz już nie mruga, ale problem z płynnością poruszania się podczas strzału pozostał
P-6974
DejaVu
» 2009-05-17 21:35:30
Płynność gry możesz 'zapewnić' za pomocą timerów - poczytaj w kursie (allegro). Timer umożliwia wywoływanie jakiegoś kodu np. co 20ms, co dawałoby 50 klatek na sekundę. Myślę, że taka wartość byłaby zadowalająca dla gracza i jednocześnie gra płynnie by działała.
P-6982
Camper
Temat założony przez niniejszego użytkownika
» 2009-05-18 10:16:30
Z problemem przeskakiwania już sobie poradziłem, jednak teraz jest następny, jak zrobić tak żeby oba obiekty mogły strzelać równocześnie.
W tej chwili jak naciskam przycisk strzału jednego obiektu, i równocześnie nacisnę przycisk drugiego to tylko ten pierwszy widać, i jak on doleci do końca pokazuje się ten drugi.
Podejrzewam że jest to wynikiem oczyszczania bufora po każdym przesunięciu pierwszego strzały dlatego też drugiego nie widać, jednak nie jestem pewien i nie wiem jak to rozwiązać. Umieściłem strzały na innych buforach ale nie działa za bardzo.
Zamieszczę cały kod żebyście to mogli sprawdzić.

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;
   
};


Cpostac statek, enemy;
#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()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 24 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
    //install_mouse();
   
   
   
    BITMAP * bufor = NULL;
    BITMAP * bufor2 = NULL;
    BITMAP * bufor3 = NULL;
    BITMAP * statek = NULL;
    BITMAP * strzal = NULL;
    BITMAP * enemy = NULL;
    SAMPLE * dzwiek = NULL;
    BITMAP * bmp = NULL;
   
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    bufor2 = create_bitmap( 800, 600 );
    if( !bufor2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    bufor3 = create_bitmap( 800, 600 );
    if( !bufor2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    dzwiek = load_sample( "tyk.wav" );
    if( !dzwiek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować dzwieku !" );
        allegro_exit();
        return 0;
    }
    bmp = load_bmp( "tlo.bmp", default_palette ); //Podajemy nazwę, of korz
    masked_blit( bmp, bufor2, 0, 0, 0, 0, bmp->w, bmp->h );
    blit( bufor2, screen, 0, 0, 0, 0, 800, 600 );
    //show_mouse(screen);
    //unscare_mouse();
   
   
    enemy = load_bmp( "enemy.bmp", default_palette );
    int enemy_x = 425, enemy_y = 100, enemy_s = 50, enemy_w = 50;
    statek = load_bmp( "statek.bmp", default_palette );
    int statek_x = 400, statek_y = 300, statek_s = 50, statek_w = 50;
    strzal = load_bmp( "strzal.bmp", default_palette );
    int strzal_x = statek_x, strzal_y = statek_y, strzal_s = 25, strzal_w = 25;
    int frame = 0;
    int i;
   
    while( !key[ KEY_ESC ] )
    {
        if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
       
        if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
       
        if( key[ KEY_UP ] ) statek_y = statek_y - 2;
       
        if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;
       
        if( key[ KEY_A ] ) enemy_x = enemy_x - 2;
       
        if( key[ KEY_D ] ) enemy_x = enemy_x + 2;
       
        if( key[ KEY_W ] ) enemy_y = enemy_y - 2;
       
        if( key[ KEY_S ] ) enemy_y = enemy_y + 2;
       
        frame++;
        if( frame > 40 ) frame = 0;
       
        while( speed > 0 )
        {
            // if( key[KEY_A]) enemy_x=enemy_x-11;
            // if( key[KEY_D]) enemy_x=enemy_x+11;
            // if( key[KEY_W]) enemy_y=enemy_y-11;
            // if( key[KEY_S]) enemy_y=enemy_y+11;
            if( key[ KEY_C ] )
            {
                int strzal_x = enemy_x + 10, strzal_y = enemy_y + 10, strzal_s = 25, strzal_w = 25;
               
                while( strzal_y < 600 )
                {
                    if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); }
                    else { draw_sprite( bufor2, bmp, 0, 0 ); }
                   
                    if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
                    else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
                   
                    if( frame < 20 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); }
                    else { draw_sprite( bufor2, statek, statek_x, statek_y ); }
                   
                    if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
                    else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
                   
                    blit( bufor2, screen, 0, 0, 0, 0, 800, 600 );
                    strzal_y = strzal_y + 10;
                    clear_to_color( bufor2, makecol( 150, 150, 150 ) );
                   
                    if( kolizja( statek_x, statek_y, statek_s, statek_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true )
                    { play_sample( dzwiek, 255, 127, 3000, 0 ); }
                    if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
                   
                    if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
                   
                    if( key[ KEY_UP ] ) statek_y = statek_y - 2;
                   
                    if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;
                   
                    if( key[ KEY_A ] ) enemy_x = enemy_x - 2;
                   
                    if( key[ KEY_D ] ) enemy_x = enemy_x + 2;
                   
                    if( key[ KEY_W ] ) enemy_y = enemy_y - 2;
                   
                    if( key[ KEY_S ] ) enemy_y = enemy_y + 2;
                   
                    if( key[ KEY_M ] )
                    {
                       
                       
                        int strzal_x = statek_x + 10, strzal_y = statek_y + 10, strzal_s = 25, strzal_w = 25;
                       
                        while( strzal_y > 1 )
                        {
                           
                            if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); }
                            else { draw_sprite( bufor, bmp, 0, 0 ); }
                           
                            if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); }
                            else { draw_sprite( bufor, statek, statek_x, statek_y ); }
                           
                            if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
                            else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
                           
                            if( frame < 40 ) { draw_sprite( bufor, strzal, strzal_x, strzal_y ); }
                            else { draw_sprite( bufor, strzal, strzal_x, strzal_y ); }
                           
                            blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
                            clear_to_color( bufor, makecol( 150, 150, 150 ) );
                            strzal_y = strzal_y - 10;
                           
                            if( kolizja( enemy_x, enemy_y, enemy_s, enemy_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true )
                            { play_sample( dzwiek, 255, 127, 3000, 0 ); }
                            if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
                           
                            if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
                           
                            if( key[ KEY_UP ] ) statek_y = statek_y - 2;
                           
                            if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;
                           
                            if( key[ KEY_A ] ) enemy_x = enemy_x - 2;
                           
                            if( key[ KEY_D ] ) enemy_x = enemy_x + 2;
                           
                            if( key[ KEY_W ] ) enemy_y = enemy_y - 2;
                           
                            if( key[ KEY_S ] ) enemy_y = enemy_y + 2;
                           
                        }
                    } } }
            /* else
                  {  
                      if( key[KEY_LEFT]) statek_x=statek_x-2;
                      if( key[KEY_RIGHT]) statek_x=statek_x+2;
                      if( key[KEY_UP]) statek_y=statek_y-2;
                      if( key[KEY_DOWN]) statek_y=statek_y+2;
                      if( key[KEY_A]) enemy_x=enemy_x-11;
                      if( key[KEY_D]) enemy_x=enemy_x+11;
                      if( key[KEY_W]) enemy_y=enemy_y-11;
                      if( key[KEY_S]) enemy_y=enemy_y+11;
                  }      */
            // if( key[KEY_LEFT]) statek_x=statek_x-2;
            // if( key[KEY_RIGHT]) statek_x=statek_x+2;
            //if( key[KEY_UP]) statek_y=statek_y-2;
            //  if( key[KEY_DOWN]) statek_y=statek_y+2;
            if( key[ KEY_M ] )
            {
               
               
                int strzal_x = statek_x + 10, strzal_y = statek_y + 10, strzal_s = 25, strzal_w = 25;
               
                while( strzal_y > 1 )
                {
                   
                    if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); }
                    else { draw_sprite( bufor, bmp, 0, 0 ); }
                   
                    if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); }
                    else { draw_sprite( bufor, statek, statek_x, statek_y ); }
                   
                    if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
                    else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
                   
                    if( frame < 40 ) { draw_sprite( bufor, strzal, strzal_x, strzal_y ); }
                    else { draw_sprite( bufor, strzal, strzal_x, strzal_y ); }
                   
                    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
                    clear_to_color( bufor, makecol( 150, 150, 150 ) );
                    strzal_y = strzal_y - 10;
                   
                    if( kolizja( enemy_x, enemy_y, enemy_s, enemy_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true )
                    { play_sample( dzwiek, 255, 127, 3000, 0 ); }
                    if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
                   
                    if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
                   
                    if( key[ KEY_UP ] ) statek_y = statek_y - 2;
                   
                    if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;
                   
                    if( key[ KEY_A ] ) enemy_x = enemy_x - 2;
                   
                    if( key[ KEY_D ] ) enemy_x = enemy_x + 2;
                   
                    if( key[ KEY_W ] ) enemy_y = enemy_y - 2;
                   
                    if( key[ KEY_S ] ) enemy_y = enemy_y + 2;
                   
                    if( key[ KEY_C ] )
                    {
                        int strzal_x = enemy_x + 10, strzal_y = enemy_y + 10, strzal_s = 25, strzal_w = 25;
                       
                        while( strzal_y < 600 )
                        {
                            if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); }
                            else { draw_sprite( bufor2, bmp, 0, 0 ); }
                           
                            if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
                            else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); }
                           
                            if( frame < 20 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); }
                            else { draw_sprite( bufor2, statek, statek_x, statek_y ); }
                           
                            if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
                            else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); }
                           
                            blit( bufor2, screen, 0, 0, 0, 0, 800, 600 );
                            strzal_y = strzal_y + 10;
                            clear_to_color( bufor2, makecol( 150, 150, 150 ) );
                           
                            if( kolizja( statek_x, statek_y, statek_s, statek_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true )
                            { play_sample( dzwiek, 255, 127, 3000, 0 ); }
                            if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;
                           
                            if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;
                           
                            if( key[ KEY_UP ] ) statek_y = statek_y - 2;
                           
                            if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;
                           
                            if( key[ KEY_A ] ) enemy_x = enemy_x - 2;
                           
                            if( key[ KEY_D ] ) enemy_x = enemy_x + 2;
                           
                            if( key[ KEY_W ] ) enemy_y = enemy_y - 2;
                           
                            if( key[ KEY_S ] ) enemy_y = enemy_y + 2;
                           
                        }
                    }
                }
            }
            /* else
                           {
                              if( key[KEY_LEFT]) statek_x=statek_x-2;
                              if( key[KEY_RIGHT]) statek_x=statek_x+2;
                              if( key[KEY_UP]) statek_y=statek_y-2;
                              if( key[KEY_DOWN]) statek_y=statek_y+2;
                               if( key[KEY_A]) enemy_x=enemy_x-11;
                              if( key[KEY_D]) enemy_x=enemy_x+11;
                              if( key[KEY_W]) enemy_y=enemy_y-11;
                              if( key[KEY_S]) enemy_y=enemy_y+11;
                            }*/
           
           
           
           
            speed--;
        }
       
        clear_to_color( bufor, makecol( 255, 0, 255 ) );
       
        if( enemy_x < 0 ) { enemy_x = 800; }
        if( enemy_y < 0 ) { enemy_y = 600; }
        if( enemy_x > 800 ) { enemy_x = 0; }
        if( enemy_y > 600 ) { enemy_y = 0; }
        if( statek_x < 0 ) { statek_x = 800; }
        if( statek_y < 0 ) { statek_y = 600; }
        if( statek_x > 800 ) { statek_x = 0; }
        if( statek_y > 600 ) { statek_y = 0; }
        if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); }
        else { draw_sprite( bufor, bmp, 0, 0 ); }
        if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
        else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); }
        if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); }
        else { draw_sprite( bufor, statek, statek_x, statek_y ); }
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
   
    remove_int( increment_speed );
    destroy_bitmap( statek );
    destroy_bitmap( enemy );
    destroy_bitmap( strzal );
    stop_sample( dzwiek );
    destroy_bitmap( bufor );
    destroy_sample( dzwiek );
    destroy_bitmap( bufor2 );
    destroy_bitmap( bmp );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-6995
DejaVu
» 2009-05-18 16:12:17
Źle robisz animację strzału. Powinna być jedna pętla główna:
C/C++
while( !key[ KEY_ESC ] )
{
    //1. czyść bufor
    //2. aktualizuj pozycję (po wciśnięciu klawisza)
    //3. jeśli pocisku nie ma na ekranie i wciśnięto fire, ustaw pocisk na ekranie w pozycji statu i nadaj mu kierunek lotu
    //4. jeśli pocisk jest na ekranie przesuń go o N'px zgodnie z wcześniej ustalonym lotu
    //5. jeśli pocisk wyleciał poza ekranem ustaw flagę, że pocisku nie ma na ekranie
    //6. rysuj wszystko na buforze
    //7. wyświetl bufor
} //
Robiąc animacje nie należy zagnieżdżać nigdy pętli, ponieważ:
1. blokujesz sobie możliwość łatwego dodawania kolejnej animacji do kodu
2. musisz powielać te same funkcjonalności, które są obsłużone w każdej wcześniejszej pętli, jeśli funkcjonalność ich ma zostać zachowana
P-7000
Camper
Temat założony przez niniejszego użytkownika
» 2009-05-18 17:28:34
starałem się napisać to co mi poradziłeś ale nie do końca umiem.
To się nie kompiluje ponieważ pisze że strzal_y jest niezadeklarowane i nie można go użyć.

C/C++
clear_to_color( bufor, makecol( 150, 150, 150 ) );
if( key[ KEY_LEFT ] ) statek_x = statek_x - 2;

if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2;

if( key[ KEY_UP ] ) statek_y = statek_y - 2;

if( key[ KEY_DOWN ] ) statek_y = statek_y + 2;

if( key[ KEY_A ] ) enemy_x = enemy_x - 2;

if( key[ KEY_D ] ) enemy_x = enemy_x + 2;

if( key[ KEY_W ] ) enemy_y = enemy_y - 2;

if( key[ KEY_S ] ) enemy_y = enemy_y + 2;

strzal = load_bmp( "strzal.bmp", default_palette );

if( key[ KEY_M ] ) { if( !strzal ) {
        int strzal_x = statek_x, strzal_y = statek_y, strzal_s = 25, strzal_w = 25; } else { strzal_y-- } }
if( strzal_y > 0 ) { strzal_y = strzal_y - 5; }

draw_sprite( bufor, strzal, strzal_x, strzal_y );
draw_sprite( bufor, statek, statek_x, statek_y );
draw_sprite( bufor, enemy, enemy_x, enemy_y );
blit( bufor, screen, 0, 0, 0, 0, 800, 600 );

if( enemy_x < 0 ) { enemy_x = 800; }
if( enemy_y < 0 ) { enemy_y = 600; }
if( enemy_x > 800 ) { enemy_x = 0; }
if( enemy_y > 600 ) { enemy_y = 0; }
if( statek_x < 0 ) { statek_x = 800; }
if( statek_y < 0 ) { statek_y = 600; }
if( statek_x > 800 ) { statek_x = 0; }
if( statek_y > 600 ) { statek_y = 0; }
}
P-7007
lynx
» 2009-05-18 20:53:13
Deklarujesz zmienne w if a chcesz używać je za nim.
C/C++
if( key[ KEY_M ] ) { if( !strzal ) {
        int strzal_x = statek_x, strzal_y = statek_y, strzal_s = 25, strzal_w = 25; }
Zadeklaruj zmienne gdzie indziej, wcześniej, a tu zostaw same definicje.
P-7016
« 1 » 2
  Strona 1 z 2 Następna strona