Przemok123 Temat założony przez niniejszego użytkownika |
[Allegro, C++ ] Skok postacia » 2011-10-04 18:39:28 Witam Mam sobie jakiegoś ludka, który się rusza za pomocą strzałek w prawo i w lewo wraz z animacją. Chciałbym aby on wykonywał także skok, tylko nie wiem jak za to się zabrać. Oto kod tego mojego ludka z poruszaniem prawo, lewo + animacja: #include <allegro.h>
struct Cpostac { int x, y; short int kierunek, klatka; };
Cpostac ludek;
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( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); BITMAP * bufor = NULL; BITMAP * tlo = NULL; BITMAP * ludekb = NULL; tlo = load_bmp( "tlo.bmp", default_palette ); if( !tlo ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka tlo !" ); allegro_exit(); return 0; } 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; } ludekb = load_bmp( "animacja.bmp", default_palette ); int frame = 0; ludek.x = 380; ludek.y = 380; ludek.klatka = 0; ludek.kierunek = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { ludek.kierunek = 0; if( key[ KEY_LEFT ] ) { ludek.kierunek = 1; ludek.x -= 2; } if( key[ KEY_RIGHT ] ) { ludek.kierunek = 2; ludek.x += 2; } speed--; frame++; if( frame > 40 ) frame = 0; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h ); if( frame < 20 ) { ludek.klatka = 0; } else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; } masked_blit( ludekb, bufor, ludek.kierunek * 176, ludek.klatka * 209, ludek.x, ludek.y, 176, 209 ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( ludekb ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
SeaMonster131 |
» 2011-10-04 19:04:39 Kod niepotrzebny, bo wątpie, żeby ktoś Ci napisał całą gre za Ciebie. To tak..na samym początku możesz poszukać tutaj na forum tematów takich, bo było ich naprawdę bardzo dużo. Później możesz sam coś napisać. Skocz i zobacz co się dzieje: najpierw podnosisz się do góry do pewnego momentu, a później spadasz - coraz szybciej. Na początku możesz zrobić "sztywne" spadanie (czyli takie, w którym spadasz ruchem jednostajnym, czyt. z taką samą prędkością), a później zgodnie z prawami fizyki (czyli im dłużej spadasz tym szybciej lecisz), aczkolwiek to drugie też łatwo napisać. Pomyśl - napisz w kodzie i kombinuj :) Tak się zawsze najwięcej nauczysz, logicznego myślenia :) |
|
TenNewbie |
» 2011-10-05 23:59:30 Hehe, ja też miałem spore problemy z skakaniem, na szczęście znalazłem sposób: Stwórz zmienną np. int licznik = 0;, potem w głównej pętli zrób tak że jeżeli zostanie wciśnięta strzałka do góry to licznik = 100; potem nadal w pętli zrób coś takiego if(licznik>0 && kolizja = true) /*oczywiście najpierw trzeba napisać kolizje*/ a w tym "IFie" napisz coś takiego ludek_y--; licznik--; + w pętli głównej musisz oczywiście mieć coś w rodzaju grawitacji, tak aby ludek ciągle opadał ludek_y++; Jeżeli chcesz aby ludek podczas skoku wznosił się coraz wolniej, musisz stworzyć zmienną np. double licznik2 = 0; a w "IFie" zamiast ludek_y--; zrób ludek_y = ludek_y - licznik2; w głównej pętli musisz zrobić tak aby licznik2 ciągle się pomniejszał licznik2 = licznik2 - 0.25; A i oczywiście w kolizji trzeba zresetować liczniki. Nie wiem czy coś zrozumiałeś, ale mam nadzieje że tak :D |
|
akwes |
» 2011-10-06 00:13:08 @TenNewbie, nie łatwiej użyć po prostu wzoru? Lub ewentualnie ax^2 + bx + c ? |
|
SeaMonster131 |
» 2011-10-06 15:49:51 a w tym "IFie" napisz coś takiego ludek_y--; licznik--; + w pętli głównej musisz oczywiście mieć coś w rodzaju grawitacji, tak aby ludek ciągle opadał ludek_y++; |
@TenNewbie: To Ci nie zadziała :P Bo postać ma np cały czas spadać, aż tam coś napotka. Więc, przy skoku postać po prostu zatrzyma się :) Bo grawitacja będzie ciągnęła go w dół z taką samą siłą jak ludek będzie skakać (czyli siły równoważą się, wypadkowa jest równa 0 ;p) :P Więc trzeba dać, że ludek ma spadać do napotkania czegoś i kiedy skok=false ;) |
|
TenNewbie |
» 2011-10-06 16:35:29 Albo ludek_y= ludek_y -2 Straci minimalnie na płynności, raczej tego się na zauważy ;] Nie jest ekspertem od allegro, sam w tym siedzę od niedawna, ale kilka razy już wykorzystałem mój sposób, efekt jest bardzo fajny.
|
|
akwes |
» 2011-10-06 16:40:21 Jeżeli platformówka ma cały czas jeden poziom to będzie działać :P |
|
wojtu111 |
:) » 2011-10-06 20:28:59 A ja Ci proponuje zastosować rzut ukośny ( takie cuś z fizyki, wzory do niego łatwo znaleźć ) hymm sam na tym zrobiłem i nawet byłem zadowolony. I nie koniecznie będzie działać tylko w jednej płaszczyźnie ale można napisać że jeżeli jest kolizja bo na "coś" upadł to po prostu "wyłączyć" skok i zostawić na tej wysokości ;) Namieszałem ale może coś to pomoże. Nic nie jest łatwo, spróbuj coś napisać a my nakierujemy Cie jak dalej nie będzie działać ;)
Pozdrawiam wojtu111 |
|
« 1 » 2 |