lemis.aryl Temat założony przez niniejszego użytkownika |
[Allegro, C++] Zatrzymywanie się przeciwnika » 2010-05-29 18:03:54 Chciałem uzyskać następujący efekt: A------------------------------------B postać spaceruje sobie od punktu A do punktu B i powinna zatrzymywać się na chwilę w każdym punkcie. Jak to mam w zwyczaju wypociłem kilka ifów: int ruch = 0; if( ruch == 0 ) { dre.x++; if( dre.x >= 200 ) { ruch = 1; } } if( ruch == 1 ) { dre.x--; if( dre.x <= 2 ) { ruch = 0; } } Tylko jak teraz zrobić aby postać zatrzymywała się na chwilę w tych punktach? I druga sprawa: jak zmniejszyć prędkość chodzenia postaci? Jeśli ktoś ma jakiś pomysł to proszę o pomoc.g |
|
ison |
» 2010-05-29 18:17:37 zrob zmienna powiedzmy game_timer i w pętli powiększaj ją zawsze o 1. Przesuwaj postac tylko gdy game_timer%2==0. Co do szybkosci programu to zalezy jakich timerow uzywasz (jesli nie wiesz tutaj o czym mowie to koniecznie przeczytaj o timerach - bez nich nie zrobisz gry ktora bedzie chodzila tak samo na wszystkich komputerach) |
|
dmx81 |
» 2010-05-29 18:44:06 timery pomoga, aby predkosc byla zawsze jednakowa, mozesz tez zrobic cos takiego:
dajesz zmienna licznik, w glownej petli licznik++, pozniej if(licznik>100), postac.x++, licznik=0;
za 100 podstawiasz jaka chcesz wartosc, pamietaj o zerowaniu licznika po kazdym osiagnieciu oczekiwanej wartosci |
|
ison |
» 2010-05-29 18:57:04 kolega wyżej nie wie chyba dokładnie co to timer... przy jego rozwiązaniu na wszystkich komputerach zależnie od procesora będzie chodziło z różną prędkością przykładowe użycie timera w bibliotece allegro. Dzieki temu na wszystkich komputerach program bedzie chodzil z taka sama predkoscia #include <allegro.h>
using namespace std;
int fps, fpscounter; void fps_proc() { fps++; } END_OF_FUNCTION( fps_proc );
int main() { allegro_init(); int depth = desktop_color_depth(); if( depth == 0 ) depth = 32; set_color_depth( depth ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 128, 128, 128 ) ); install_keyboard(); install_mouse(); install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" ); set_volume( 255, 255 ); install_int_ex( fps_proc, BPS_TO_TIMER( 30 ) ); fps = fpscounter = 0; while( !key[ KEY_ESC ] ) { if( fpscounter == 1000 ) fps = fpscounter = 0; fpscounter++; if( fpscounter >= fps ) { } while( fpscounter > fps ); } allegro_exit(); return 0; } END_OF_MAIN();
|
|
lemis.aryl Temat założony przez niniejszego użytkownika |
» 2010-05-29 19:17:46 Używam timera. Chodziło mi o zmniejszenie prędkości tylko tego ludzika, nie całego programu. Chyba się trochę źle wyraziłem. |
|
ison |
» 2010-05-29 19:19:08 no to juz ci odpowiedzialem w pierwszej wiadomosci ;) zrob zmienna powiedzmy game_timer i w pętli powiększaj ją zawsze o 1. Przesuwaj postac tylko gdy game_timer%2==0
|
|
DejaVu |
» 2010-05-29 21:51:04 Dostosuj program tak aby można było używać liczb rzeczywistych do określania położenia obiektów (w tym ludzika), np: Oczywiście zmiana int na float będzie pociągała bardzo dużo konsekwencji oraz zmian w kodzie, które będą wymagały sporego wkładu pracy jeżeli projekt jest już duży, a nie są to jego początki. |
|
dmx81 |
» 2010-05-29 22:03:23 dlatego napisalem moje rozwiazanie, oczywiscie ze wiem, od czego sa timery - byc moze w pospiechu nieco ogolnikowo napisalem (ze bedzie dzialalo ze stala predkoscia znaczy sie, ze jesli ustalimy wartosc 60, tyle wlasnie razy na sekunde wykona sie kod - oczywiscie to tez w uproszczeniu ) no i dlatego podsunalem tez wlasne rozwiazanie nawiazujac do podpowiedzi p.Piotra. dajac zmienna typu int licznik... a lepiej z kodem bedzie: while( key[ KEY_ESC ] { ... while( speed > 0 ) { ... speed--; licznik++; } if( licznik > 60 ) { ludek.x++; licznik = 0; } ... }
sam stosuje w swoich programo-gierkach wiele takich licznikow, dla roznych obiektow i dziala wzorowo, polecam wyprobowanie autorowi postu i ocene |
|
« 1 » 2 |