Tombol Temat założony przez niniejszego użytkownika |
[Allegro] Pocisk nie chce lecieć cały czas » 2008-10-03 14:06:12 Nie chce w starym temacie dawać mojego problemu bo można tylko 1 na temat to zrobiłem nowy i mam taki problem. Chce zrobić że naciśnie się guzik i pocisk leci ciągle do góry ale niestety nie wiem jak to zrobić, kod: #include <allegro.h> #include<iostream> #include <winalleg.h> #include <windows.h> volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int statek_x = 500, statek_y = 440; int pocisk_x = statek_x, pocisk_y = 440;
bool kolizja( void ) { if( statek_x > 590 ) return true; if( statek_x < 10 ) return false; } bool shoot( void ) { if( pocisk_y < - 40 ) return true; if( pocisk_y > - 60 ) return false; }
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); clear_to_color( screen, makecol( 0, 0, 0 ) ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) ); BITMAP * statek = NULL; BITMAP * pocisk = NULL; BITMAP * bufor = NULL; bufor = create_bitmap( 640, 480 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } statek = load_bmp( "statek.bmp", default_palette ); if( !statek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka statek!" ); allegro_exit(); return 0; } pocisk = load_bmp( "pocisk.bmp", default_palette ); if( !pocisk ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka pocisk!" ); allegro_exit(); return 0; } while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ) { statek_x--; if( kolizja() == false ) { statek_x++; } } if( key[ KEY_RIGHT ] ) { statek_x++; if( kolizja() == true ) { statek_x--; } } if( key[ KEY_SPACE ] ) { pocisk_y--; } } speed--; masked_blit( statek, bufor, 0, 0, statek_x, statek_y, statek->w, statek->h ); masked_blit( pocisk, bufor, 0, 0, pocisk_x, pocisk_y, pocisk->w, pocisk->h ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); }
remove_int( increment_speed ); destroy_bitmap( statek ); destroy_bitmap( pocisk ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
Niestety próbowałem używać funkcji sleep rest wrzucałem to w pętle wrzucałem po pętli robiłem wszystko co możliwe a najwyżej co pocisk robił to czekał kilka chwil i teleportował się w inne miejsce :/ |
|
DejaVu |
» 2008-10-03 14:15:54 |
|
lynx |
» 2008-10-03 14:24:37 Wyjmij funkcję pocisk_y++; i daj ją nie w instrukcji if tylko na zewnątrz, tak aby za każdym obrotem pętli była dodawana. if( key[ KEY_SPACE ] ) { pocisk_y--; }
Zamiast tego w bloku if(key(KEY_SPACE]) umieść przypisanie x, y pocisku do jakiegoś miejsca na planszy np. statku. |
|
Tombol Temat założony przez niniejszego użytkownika |
» 2008-10-03 14:26:29 A w tzm tekscie pokaz_pocisk=true; to co to jest to bedzie to masked_blit( pocisk, bufor, 0,0, pocisk_x, pocisk_y, pocisk->w, pocisk->h); ? |
|
lynx |
» 2008-10-03 16:09:18 Zabardzo Cie nie zrozumiałem. Jeżeli chodzi Ci co znaczy ta funkcja, to ona rysuje obrazek. Czym się różni od zwykłego blit-a? Tym, że ona kolor 255,0,255 (w RGB) rysuje jako przezroczysty, czyli nie rysuje. ;P |
|
Tombol Temat założony przez niniejszego użytkownika |
» 2008-10-03 19:28:58 No chodzi mi o to ca każda z tych funkcji oznacza bo jak napisze rysuj to kompilator raczej nie będzie wiedział o co mi chodzi :P |
|
lynx |
» 2008-10-03 20:09:26 To masz napisane w tutorialu, ale niech Ci będzie. Czym się różni masked_blit od blit to już mówiłem, więc teraz Ci opiszę tylko jedną funkcję ;P A więc w funkcji: masked_blit( statek, bufor, 0,0, statek_x, statek_y, statek->w, statek->h); Miejsce pierwsze jest przypisane wskaźnikowi do obiektu typu BITMAP, czyli po prostu do obrazka. Miejsce drugie jest przypisane miejscu w którym mamy coś wyświetlić(statek) do dyzpozycji mamy screen(ekran), oraz różnego rodzaju stworzone przez nas bitmpay funkcją create_bitmap. W tym przykładzie jest to bufor. Dlaczego? Ponieważ gdybyśmy zastosowali odrazu screen, ekran by migał, z powodu wyświetlania po koleji (jedno po drugim, ale oddzielnie) obrazków. Gdy zastosujemy bufor, obrazki wyświetlają się jedno po drugim, ale w buforze, czego nie widzimy. Później wszystko nagle zostaje wyświetlone. (tylko bufor) Co niszczy efekt mrugania. Miejsca 3-4 oznaczają od jakiego elemntu (pixele) zacząć wyświetlać obrazek. Bardzo przydatne do animacji, pod koniec dam Ci linka. Przykładowo masz obrazek 50 x 50, a dzięki tej funkcji możesz wyświetlić obrazek 20 x 20 omijająć sam początek obrazka. W pole musiałbyś wtedy wpisać 30 i 30. Miejsca 5-6 oznaczają gdzie wyświetlić obrazek w pixelach. Zresztą to chyba wiesz. ;P Miejsca 7-8 są przypisane ile z obrazka(pixele) chcemy wyświetlić. Mając obrazek 50 x 50, i chcąc wyświetlić jego sam środek o powierzchni 10 x 10 pixeli. Funkcja wyglądała by tak: masked_blit( statek, bufor, 25,25, statek_x, statek_y, 10, 10); A wpisując w ostatnie pola statek->h i statek->w, ustawiasz to pole ta wielkości obrazka. A oto obiecany link do animacji: http://www.easykoder.yoyo.pl/index.php?mm=anim Pozdr. Piotrek |
|
Tombol Temat założony przez niniejszego użytkownika |
» 2008-10-03 20:21:07 Thx że się napisałeś ale ja to wiem xD I nadal nie wiem jak to zrobić xD To może inaczej czy jest możliwe żeby po każdym obiegu pętli pętla zatrzymywała się na 1 milisekundę i znów obieg :P Próbowałem tak robić ale może coś źle robiłem :p |
|
« 1 » 2 3 |