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 : 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. |
|
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: 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: 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: void Skok( float & y ) { const float poziomGruntu = 330; static float predkosc = 0; if( key[ KEY_UP ] && y == poziomGruntu ) { predkosc = 10; } y += predkosc; predkosc -= 1.5; if( y <= poziomGruntu ) { predkosc = 0; y = poziomGruntu; } }
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. |
|
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 :)
|
|
Programista129 Temat założony przez niniejszego użytkownika |
» 2008-11-08 20:58:23 Wykombinowałem coś takiego :) 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. |
|
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. void Skok( float & y ) { const float poziomGruntu = 330; static float predkosc = 0; if( key[ KEY_UP ] && y == poziomGruntu ) { predkosc = - 10; } y += predkosc; predkosc += 0.3; if( y >= poziomGruntu ) { predkosc = 0; y = poziomGruntu; } }
|
|
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 :) |
|
« 1 » |