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

[Allegro] Funkcja odpowiadająca za skok

Ostatnio zmodyfikowano 2008-11-08 21:15
Autor Wiadomość
Programista129
Temat założony przez niniejszego użytkownika
[Allegro] Funkcja odpowiadająca za skok
» 2008-11-08 18:21:26
Przeczytałem już kilka tematów o grawitacji w allegro i jak próbowałem to zrobić, to było wszystko ok, ale postanowiłem zrobić funkcję odpowiadającą za skok danej bitmapy i tutaj zaczęły się pojawiać problemy :/ Próbowałem to zrobić np. tak :

C/C++
int skok( float ludek_y )
{
    float ludek_ruch_y =- 10;
    ludek_y += ludek_ruch_y;
    ludek_ruch_y += 0.3;
    Sleep( 10 );
}
 
I się kompiluje, niestety nie działa, jak nacisnę strzałkę w górę (czyli piszę tak
if( key[ KEY_UP ] ) skok( ludek_y )
 to stoi w miejscu :/

Wie ktoś co trzeba poprawić aby wszystko dobrze działało ?

Pozdrawiam. 
P-2482
DejaVu
» 2008-11-08 18:55:03
Nie uda Ci się wydzielić kodu skakania z efektem grawitacji do funkcji w prosty sposób. Masz zdecydowanie za małą wiedzę, ja nawet musiałbym trochę pomyśleć jak to zrobić i zaprojektować odrazu przy tym sporą część gry.

Pozycja Ci się nie zmienia z prostego powodu - nie używasz referencji. Twój zapis wygląda mniej więcej tak:
C/C++
int funkcja( float parametr )
{
    //...
    parametr += 30;
}

Bez użycia symbolu referencji przy zmiennej parametr wartość będzie zmieniana lokalnie (ponieważ tworzona jest kopia zmiennej). Jeśli chcesz mieć możliwość zmiany zmiennej przekazanej przez parametr funkcji, kod musi wyglądać tak:
C/C++
int funkcja( float & parametr )
{
    //...
    parametr += 30;
}

Sposób w jaki chcesz zrobić skok spowoduje serię błędów, których naprawa będzie wiązała się z przekazywaniem do funkcji 3 parametrów. Dodatkowo warto tu zauważyć, że skok powinien działać tylko i wyłącznie wtedy gdy ludek stoi na gruncie jakimś. Obecne rozwiązanie spowoduje następujący efekt:
[li]tak długo jak będziesz trzymał klawisz, ludzik będzie leciał do góry[/li]
[li]puszczenie klawisza nie spowoduje efektu spadania[/li]

Punkt pierwszy jest oczywisty - nie masz sprawdzenia czy ludek stoi na gruncie.
Punkt drugi jest również oczywisty - część kodu wklejonego do funkcji powinna się wywoływać dla ludzika cały czas. Funkcja skoku tak na dobrą sprawę powinna się sprowadzać do:
C/C++
void Skok( float & y )
{
    const float poziomGruntu = 330;
    static float predkosc = 0;
   
    if( key[ KEY_UP ] && y == poziomGruntu )
    {
        predkosc = 10;
    } //if
   
    y += predkosc;
    predkosc -= 1.5;
   
    if( y <= poziomGruntu )
    {
        predkosc = 0;
        y = poziomGruntu;
    } //if
   
}
Jak widać powyższa funkcja nie uwzględnia tego, że może być dziura w gruncie i faktu, że grunt może być na jednej mapie prawdopodobnie na różnych wysokościach. Do tego będą potrzebne albo dodatkowe parametry do funkcji albo jakieś zmienne globalne.
P-2484
Programista129
Temat założony przez niniejszego użytkownika
» 2008-11-08 19:13:00
O sprawdzanie, czy ,,ludek" stoi na jakiejś bitmapie ja się zajmę, będzie można skoczyć dopiero wtedy, kiedy będzie na czymś stał, a co do kodu, to wkleiłem to i podskakuje lekko do góry ale od razu spada czyli tak 0.01 sekundy podskakuje i od razu spada i tak w kółko :/ chodzi mi na razie oto, aby ludek podskoczył i CIĄGLE spadał przyśpieszając, dopóki nie spotka jakiejś bitmapy, ale w funkcji ma być tylko skok i spadanie, a kolizje będą w reszcie kodu :)


 
P-2485
Programista129
Temat założony przez niniejszego użytkownika
» 2008-11-08 20:58:23
Wykombinowałem coś takiego :)

C/C++
void skok( float & ludek_y )
{
    static float ludek_ruch_y = - 10;
   
    ludek_ruch_y += 0.3;
    ludek_y += ludek_ruch_y;
    Sleep( 10 );
   
}

Teraz wszystko jest ok, ale żeby skakał muszę ciągle trzymać strzałkę w górę, ale popróbuję coś z tym zrobić ;) jakby ktoś wiedział co i jak niech napisze :)

Pozdrawiam.
P-2486
DejaVu
» 2008-11-08 21:11:11
Dostałeś przecież rozwiązanie... wystarczy poprawić parametry na takie, jakie Ciebie interesują. Teraz ludek skacze do góry i wolno spada.
C/C++
void Skok( float & y )
{
    const float poziomGruntu = 330;
    static float predkosc = 0;
   
    if( key[ KEY_UP ] && y == poziomGruntu )
    {
        predkosc = - 10;
    } //if
   
    y += predkosc;
    predkosc += 0.3;
   
    if( y >= poziomGruntu )
    {
        predkosc = 0;
        y = poziomGruntu;
    } //if
   
}
P-2488
Programista129
Temat założony przez niniejszego użytkownika
» 2008-11-08 21:15:02
aaa.. sorry, ale teraz dopiero zauważyłem, dlaczego twój kod źle działał :D wystarczyło na końcu dodać Sleep(10); i już jest ok ;)

Wielkie dzięki za pomoc :)
P-2489
« 1 »
  Strona 1 z 1