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

[Allegro] Problem z podskokiem postaci

Ostatnio zmodyfikowano 2009-08-13 13:05
Autor Wiadomość
kiler69
Temat założony przez niniejszego użytkownika
[Allegro] Problem z podskokiem postaci
» 2009-08-12 17:46:36
Witam. Z biblioteki allegro korzystam dopiero kilka dni wiec prosze o wyrozumialosc. Pisze prosta gre, a wlasciwie to bawie sie kodem, bo do gry to jeszcze duzo brakuje ;) i mam taki problem, ze gdy postac ma skoczyc to jest wszystko ok, ale niepotrzebnie rusza nogami w powietrzu, wiec postanowilem zmienic wyswietlana animacje podczas skoku. Po tej zmianie gdy postac skacze w miejscu to znika z ekranu, a gdy skacze w prawo lub w lewo to jest ok.
Oto kod z miejscem, w ktorym poruszam postacią:
C/C++
void petla()
{
    int mozna_rysowac = 0;
    int licznik = 0;
    bool skok = false;
    bool spadanie = false;
   
    while( !key[ KEY_ESC ] )
    {
        if( opuznienie )
        {
           
            if( key[ KEY_LEFT ] )
            {
                if( ludek_x > 0 )
                     ludek_x -= 8;
               
                ludek_kierunek = 0;
                mozna_rysowac = 1;
                if( pozycja_tla > 200 )
                     pozycja_tla -= 8;
               
            }
           
            if( key[ KEY_RIGHT ] )
            {
                if( ludek_x < 400 )
                     ludek_x += 8;
               
                ludek_kierunek = 1;
                mozna_rysowac = 1;
                if( pozycja_tla < 600 )
                     pozycja_tla += 8;
                else if( ludek_x < 660 )
                     ludek_x += 8;
               
            }
            if( key[ KEY_SPACE ] && licznik == 0 )
            {
                skok = true;
                licznik += 1;
            }
            if( skok == true )
            {
                //ludek_kierunek += 2;    //gdy to jest w komentarzu to jest ok!!!
                ludek_y -= 10;
                mozna_rysowac = 1;
            }
            if( ludek_y <= 300 && skok == true )
            {
                skok = false;
                spadanie = true;
            }
            if( spadanie == true )
            {
                ludek_y += 10;
                mozna_rysowac = 1;
            }
            if( ludek_y == 370 )
            {
                ludek_y = 370;
                spadanie = false;
                licznik = 0;
            }
           
            if( mozna_rysowac == 1 )
            {
                mozna_rysowac = 0;
                rysuj();
            }
           
            opuznienie = 0;
        }
    }
}
a to funkcja do obslugi animacji:
C/C++
void rysuj_ludka()
{
    if( ludek_kierunek == 0 ) //ludek w lewo
    {
        draw_sprite( bufor_ekranu, ludek[ 3 + ludek_numer_klatki ], ludek_x, ludek_y );
    }
    else if( ludek_kierunek == 1 ) //ludek w prawo
    {
        draw_sprite( bufor_ekranu, ludek[ ludek_numer_klatki ], ludek_x, ludek_y );
    }
    else if( ludek_kierunek == 2 ) // ludek skacze w lewo
    {
        draw_sprite( bufor_ekranu, ludek[ 5 ], ludek_x, ludek_y );
    }
    else if( ludek_kierunek == 3 ) // ludek skacze w prawo
    {
        draw_sprite( bufor_ekranu, ludek[ 2 ], ludek_x, ludek_y );
    }
}
Prosze o pomoc w znalezieniu bledu. Pozdrawiam... :)
P-9351
malan
» 2009-08-12 17:52:54
Pierwsze co mi się rzuciło w oczy to:
C/C++
if( key[ KEY_SPACE ] && licznik == 0 )
{
    skok = true;
    licznik += 1;
}
 Jeśli za skok odpowiada spacja to brakuje tu (prawdopodobnie) 'moznarysowac=1;.
P-9352
kiler69
Temat założony przez niniejszego użytkownika
» 2009-08-12 18:09:04
Niestety to nic nie dało, a pozwolenie na rysowanie mam zaraz po zmianie pozycji postaci:
C/C++
if( skok == true )
{
    ludek_kierunek += 2;
    ludek_y -= 10;
    mozna_rysowac = 1;
}
Patrz jeden IF nizej.
P-9354
szyx_yankez
» 2009-08-12 19:02:21
Ja bym to zrobił tak

tylko że np do skoku w lewo
musisz nacisnąć spacje i strzałkę w lewo

C/C++
int poziomgruntu = 200; //tu wpisz na jakiej wysokosci ma sie poruszac ludek
//*******************************************************
if( key[ KEY_SPACE ] && key[ KEY_RIGHT ] && ludek_y == poziomgruntu ) //
{ //  
    //     
    predkosc =- 10; //
    predkoscx =- 2; //
} //
ludek_y += predkosc;
ludek_x -= predkoscx; // skok w prawo
predkosc += 0.3; //          
if( ludek_y >= poziomgruntu ) //       
{ //
    predkosc = 0;
    predkoscx = 0; //    
    ludek_y = poziomgruntu; //  
} //
//*****************************************************
//****************************************************
if( key[ KEY_SPACE ] && key[ KEY_LEFT ] && ludek_y == poziomgruntu ) //
{ //  
    //     
    predkosc =- 10; //
    predkoscx =+ 2; //
} //
ludek_y += predkosc;
ludek_x -= predkoscx; //  skok w lewo
predkosc += 0.3; //          
if( ludek_y >= poziomgruntu ) //       
{ //
    predkosc = 0;
    predkoscx = 0; //    
    ludek_y = poziomgruntu; //  
}
//****************************************************
P-9358
kiler69
Temat założony przez niniejszego użytkownika
» 2009-08-12 22:44:02
Tez nie bardzo, albo zle łącze to z moim kodem. Gdzie sa deklaracje predkosc i predkoscx i co maja miec zainicjalizowane? W moim przykladzie tez trzeba spacje i strzalke wciskac, ale tak ma byc wiec to jest dobrze. Chodzi o to, ze jak wcisne tylko spacje, to powinien podskoczyc w miejscu, a zamiast tego postac znika z ekranu i pojawia sie dopiero jak wcisne strzalke. Tak jakby gdzie brakowalo odswiezenia bufora, tylko nie wiem gdzie. Powtarzam, ze ten problem pojawia sie tylko przy skoku w miejscu, a jak skacze w bok (np. spacja+key_right) to jest wszystko ok.
P-9368
DejaVu
» 2009-08-13 00:07:26
Ja bym się wogóle pozbył:
C/C++
if( mozna_rysowac == 1 )
Uważam, że jest to zbędne. Ekran powinien zawsze być odświeżany, więc i ludek powinien być zawsze rysowany.
P-9370
kiler69
Temat założony przez niniejszego użytkownika
» 2009-08-13 13:05:49
Nie wiem, ale to tez nic nie dało. Ekran odswiezam tylko jak ludek zrobi ruch, zeby niepotrzebnie nie ruszał nogami w miejscu.
P-9396
« 1 »
  Strona 1 z 1