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

[Allegro, C++] Zatrzymywanie się przeciwnika

Ostatnio zmodyfikowano 2010-05-30 11:02
Autor Wiadomość
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:
C/C++
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
P-17298
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)
P-17301
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
P-17304
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
C/C++
#include <allegro.h>

using namespace std;

int fps, fpscounter; //zmienne i funkcja zwiekszajaca FPS
void fps_proc()
{
    fps++;
}
END_OF_FUNCTION( fps_proc ); //koniec funkcji


int main()
{
    allegro_init(); // Nie wazne - deklaracja allegro
    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 ) ); //Tutaj okreslamy ilosc max FPS, lepiej nie wpisywac wiecej niz 100 bo na niektorych kompach moze nie wyrabiac :)
    fps = fpscounter = 0; //zerujemy zmienne dotyczace licznika FPS
    while( !key[ KEY_ESC ] )
    {
        if( fpscounter == 1000 ) fps = fpscounter = 0; //zeby sie licznik inta nie przekrecil
       
        fpscounter++;
        if( fpscounter >= fps )
        {
            //operacje, wszystko co chcemy by sie wykonywalo
        }
        while( fpscounter > fps );
       
    }
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-17307
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.
P-17312
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
P-17313
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:
C/C++
predkosc += 0.1;
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.
P-17322
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:
C/C++
while( key[ KEY_ESC ] //glowna petla
{
    ...
    while( speed > 0 ) //petla timera
    {
        ...
       
        speed--;
        licznik++;
    }
   
    if( licznik > 60 ) //czyli przy timerze dla 60cykli na sek - ruch co sekunde
    {
        ludek.x++;
        licznik = 0;
    }
   
    ...
   
} //koniec while

sam stosuje w swoich programo-gierkach wiele takich licznikow, dla roznych obiektow i dziala wzorowo, polecam wyprobowanie autorowi postu i ocene
P-17324
« 1 » 2
  Strona 1 z 2 Następna strona