Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie] Allegro - ruch postaci.


Rekomendowane odpowiedzi

Opublikowano

Witam. Mam pytanie. Czy mógłby mi ktoś wyjaśnić jak zrobić, aby w Allegro animacja wyświetlała się dopiero wtedy kiedy postaci zmieni położenie ? Tutaj jest kod zrobiony na podstawie kursu z cpp0x.pl

 

#include <allegro.h>
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 );
   clear_to_color( screen, makecol( 128, 128, 128 ) );
   install_timer();
   install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) );
   BITMAP * bufor = NULL;
   BITMAP * ludek = NULL;
   BITMAP * ludek1 = NULL;
   BITMAP * ludek2 = NULL;
   BITMAP * ludek3 = NULL;
   bufor = create_bitmap( 800, 600 );
   if( !bufor )
   {
    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
    allegro_message( "Nie zaladowano bufora" );
    allegro_exit();
    return 0;
   }
   ludek = load_bmp( "grafika1.bmp", default_palette );
   if( !ludek )
   {
    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
    allegro_message( "Nie zaladowano grafika1.bmp" );
    allegro_exit();
    return 0;
   }
   ludek1 = load_bmp( "grafika2.bmp", default_palette );
   ludek2 = load_bmp( "grafika3.bmp", default_palette );
   ludek3 = load_bmp( "grafika4.bmp", default_palette );

   int ludek_x = 0, ludek_y = 0;
   int frame = 0;
   while( !key[ KEY_ESC ] )
   {
	   while( speed > 0 )
	   {
		   if( key[ KEY_LEFT ] ) ludek_x--;

		   if( key[ KEY_RIGHT ] ) ludek_x++;

		   if( key[ KEY_UP ] ) ludek_y--;

		   if( key[ KEY_DOWN ] ) ludek_y++;

		   speed--;

		   frame++;
		   if( frame > 80 ) frame = 0;
	    }


   clear_to_color( bufor, makecol( 150, 150, 150 ) );
   if( frame < 20 ) { draw_sprite( bufor, ludek, ludek_x, ludek_y); }
   else if( frame >= 20&& frame < 40 ) { draw_sprite( bufor, ludek1, ludek_x, ludek_y); }
   else if( frame >= 40&& frame < 60 ) { draw_sprite( bufor, ludek2, ludek_x, ludek_y); }
   else if( frame >= 60&& frame < 80 ) { draw_sprite( bufor, ludek3, ludek_x, ludek_y); }
   blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
   }
   remove_int( increment_speed );

   destroy_bitmap( ludek );
   destroy_bitmap( ludek1 );
   destroy_bitmap( ludek2 );
   destroy_bitmap( ludek3 );
   destroy_bitmap( bufor );
   allegro_exit();
   return 0;
}
END_OF_MAIN();

 

Jest to animacja ruchu nogami dlatego właśnie chciałbym, aby się wyświetlała w momencie zmienienia położenia przez postać.

Kocham mame

Weteran
Opublikowano

Nie sprawdzałem kodu, ale chyba wiem o co ci chodzi.

Animacja podczas ruchu, to po prostu zmiana bitmapy po wciśnięciu odpowiedniego klawisza.

 

Czyli przy rysowaniu obrazków w głównej pętli wstaw if`a który będzie sprawdzał czy postać stoi czy się rusza, a przy ruchu postaci oprócz samego poruszania wstaw jeszcze przestawienie zmiennej, która będzie odpowiadała za przedstawienie uprzedniego if`a, aby rysował bitmapę z ruchem.

 

Hm... dawno nie robiłem już w allegro, nawet nie mam tej biblioteki zainstalowanej, dlatego ciężko mi napisać coś dla przykładu.

Jak sobie z tym nie poradzisz, to może potem coś wymyślę.

Opublikowano

Mam sprawdzić czy się rusza, tak ? Czyli mam wstawić If`a sprawdzającego prędkość postaci ?

 

if( speed < 0 )

 

Jeżeli to jest dobrze, to w funkcji tego If`a ma być kod odpowiadający za animację postaci.

Kocham mame

Opublikowano

ja bym zrobił tablice bitmap

domyślnie byłby ludek 0

czyli stojący

byłoby np 9 elementów tablicy (od 0 do 8). jeden ja stoi i 8 w ruchu

stworzyłbym zmienną float aktualnyobrazek (zaraz wytlumacze dlaczego float)

ale chcę, aby animacja trwała 1 sekunde. (przy twoich fps 80)

gdy wciskamy klawisz (odpowiadający za ruch oczywiście) dodaje do niej 0.1.

a za każdym razem(za każdym tickiem gry), gdy nie wciskamy klawisza odpowiadającego za ruch zeruje zmienną aktualnyobrazek

i przy rysowaniu bitmapy wywołujemy bitmape z

ceil(aktualnyobrazek)

elementu tablicy

czyli zaokrąglamy w góre.

to dlatego, żeby nie było sytuacji, że przez pierwsze 1/8 sekundy ruchu nasza postać dalej stoi

 

mam nadzieje, że rozumiesz ;)

Opublikowano

Czyli tak. ludek0 to jest postać stojąca w miejscy i nie robiąca żadnej czynności, a 8 innych to jest grafika postaci które np. wykonują ruch nogami.

 

Co do FPS ustawione jest 80, ponieważ stosując ten typ dodawania animacji, dzieli się ilość klatek na 4 więc wychodzi po 20 na jedną.

Jeżeli twój sposób działa to ustawię na 100, bo w kursie było napisane, że jest to jedno z lepszych rozwiązań i jeszcze co do tej animacji to cała animacja ma trwać 1 sek, niezależnie od tego ile klatek będzie mieć animacja ?

 

gdy wciskamy klawisz (odpowiadający za ruch oczywiście) dodaje do niej 0.1.

 

Czyli do współrzędnych x lub y dodaje po 0.1, aby łączny czas animacji wynosił 1 sek ?

 

Wydaję mi się, że rozumiem. Tylko przy użyciu tego rozwiązania w tej chwili wywalam część kodu i wstawiam to tak jak Ty opisałeś. Spróbuję tak zrobić, tylko zrobię to na przykładzie 4 elementów bo tyle ich mam. Jeżeli mi się uda to dam edita.

 

@EDIT

jeszcze nie ukończyłem, ale mam pytanie czy zmiennej aktualnyobrazek mam nadać wartość początkową 0 ?

Kocham mame

Opublikowano
Czyli do współrzędnych x lub y dodaje po 0.1, aby łączny czas animacji wynosił 1 sek ?

do zmiennej aktualnyobrazek

 

 

Co do FPS ustawione jest 80, ponieważ stosując ten typ dodawania animacji, dzieli się ilość klatek na 4 więc wychodzi po 20 na jedną.

Jeżeli twój sposób działa to ustawię na 100, bo w kursie było napisane, że jest to jedno z lepszych rozwiązań i jeszcze co do tej animacji to cała animacja ma trwać 1 sek, niezależnie od tego ile klatek będzie mieć animacja ?

 

msisz sobie wyliczyć tak, aby dodając jakaś wartość co każdy tick gry po czasie jaki ma mieć animacja została ona zakończona.

 

jeszcze zapomniałem dopisać, że jak wartość zmiennej aktualnyobrazek > 9 wtedy ją zeruj

 

Czyli tak. ludek0 to jest postać stojąca w miejscy i nie robiąca żadnej czynności, a 8 innych to jest grafika postaci które np. wykonują ruch nogami.

ludek[0]

 

sądziłem, ze jest to na tyle proste, że da się to od razu zrozumieć ...

Opublikowano

Mógłby ktoś pokazać na tym moim kodzie jak to zrobić ;D Po prostu nie daję sobie z tym rady :/

Kocham mame

Opublikowano

@Refersh

 

Mógłby ktoś pomóc ? Kłopot dalej nie rozwiązany, a ja przez ten czas pracowałem na grafiką.

Kocham mame

Opublikowano

To rozwiązanie, któro podałem jest chyba najprostsze. Albo czytaj i próbuj dopóki Ci się nie uda, albo zajmij się inną częścią projektu...

Opublikowano

To rozwiązanie, któro podałem jest chyba najprostsze. Albo czytaj i próbuj dopóki Ci się nie uda, albo zajmij się inną częścią projektu...

 

Chodzi mi o to, aby ktoś pokazał dowolny przykład. Nie twierdzę również, że nie próbowałem sam tego zrobić, ale gra zachowywała się cały czas nie tak jak oczekiwałem ( właściwie zmieniała się tylko zawartość kodu, lecz działał on dalej tak samo ).

Kocham mame

Opublikowano

#include <allegro.h>


volatile long speed = 0;
void increment_speed()
{
speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
inline void init()
{
allegro_init();
set_color_depth(16);
install_timer();
install_keyboard();
install_mouse();
install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) );
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
}
int main()
{
init();
BITMAP* bufor = create_bitmap(640, 480);
BITMAP* ludek[9];
for(char i = 48; i<57; i++)
{
	ludek[i-48] = load_bmp("data/gfx/ludek" + i + ".bmp", default_palette); //jak masz 9 bitmap kolejno ponumerowanych od zera
}
float anim=0;
for(;
{
	while(speed>0)
	{
		clear_to_color(bufor, makecol(255,255,255));
		{
			short frame = (int)anim;
			masked_blit(bufor, ludek[frame], 0, 0, 100, 100, ludek[frame]->w, ludek[frame]->h);
		}
		if(key[KEY_RIGHT]) anim+=0.01; //dostosuj sobie, im mniejsza wartość tym wolniejsza animacja
						  else anim = 0;
		if(anim>=9) anim = 1;
		blit(screen, bufor, 0, 0, 0, 0, bufor->w, bufor->h);
		speed=0;
	}
}
return 0;
}


nie sprawdzałem, jak nie zadziała to pisz, oganę to na spokojnie.

dorób sobie tylko obrazki i pozmieniaj ścieżkę

Opublikowano

Wywala błąd na tą linjke

 

				ludek[i-48] = load_bmp("data/gfx/ludek" + i + ".bmp", default_palette); //jak masz 9 bitmap kolejno ponumerowanych od zera

 

Wyskoczył taki błąd

 

invalid operands of types `const char*' and `const char[5]' to binary `operator+'

 

Wydaję mi się, że mogę mieć starszą wersję Allegro.

Kocham mame

Opublikowano

Wyskakuje teraz inny błąd :/ Kompletnie nie ogarniam tego błędu.

   [Linker error] undefined reference to `WinMain@16' 

 

Kod wygląda tak :

 

 

#include <allegro.h>


volatile long speed = 0;
void increment_speed()
{
	speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
inline void init()
{
	allegro_init();
	set_color_depth(16);
	install_timer();
	install_keyboard();
	install_mouse();
	install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) );
	set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
}
int main()
{
init();
BITMAP* bufor = create_bitmap(640, 480);
BITMAP* ludek[9];



ludek[0] = load_bmp( "ludek0.bmp", default_palette );
ludek[1] = load_bmp( "ludek1.bmp", default_palette );
ludek[2] = load_bmp( "ludek2.bmp", default_palette );
ludek[3] = load_bmp( "ludek3.bmp", default_palette );
ludek[4] = load_bmp( "ludek4.bmp", default_palette );
ludek[5] = load_bmp( "ludek5.bmp", default_palette );
ludek[6] = load_bmp( "ludek6.bmp", default_palette );
ludek[7] = load_bmp( "ludek7.bmp", default_palette );
ludek[8] = load_bmp( "ludek8.bmp", default_palette );

float anim=0;
	for(;
	{

			while(speed>0)
			{
					clear_to_color(bufor, makecol(255,255,255));
					{
							short frame = (int)anim;
							masked_blit(bufor, ludek[frame], 0, 0, 100, 100, ludek[frame]->w, ludek[frame]->h);
					}
					if(key[KEY_RIGHT]) anim+=0.01; //dostosuj sobie, im mniejsza wartość tym wolniejsza animacja
													  else anim = 0;
					if(anim>=9) anim = 1;
					blit(screen, bufor, 0, 0, 0, 0, bufor->w, bufor->h);
					speed=0;
			}
	}
return 0;
}

 

 

Kocham mame

Opublikowano
#include <allegro.h>


volatile long speed = 0;
void increment_speed()
{
               speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
inline void init()
{
               allegro_init();
               set_color_depth(16);
               install_timer();
               install_keyboard();
               install_mouse();
               install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) );
               set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
}
int main()
{
init();
BITMAP* bufor = create_bitmap(640, 480);
BITMAP* ludek[9];



ludek[0] = load_bmp( "ludek0.bmp", default_palette );
ludek[1] = load_bmp( "ludek1.bmp", default_palette );
ludek[2] = load_bmp( "ludek2.bmp", default_palette );
ludek[3] = load_bmp( "ludek3.bmp", default_palette );
ludek[4] = load_bmp( "ludek4.bmp", default_palette );
ludek[5] = load_bmp( "ludek5.bmp", default_palette );
ludek[6] = load_bmp( "ludek6.bmp", default_palette );
ludek[7] = load_bmp( "ludek7.bmp", default_palette );
ludek[8] = load_bmp( "ludek8.bmp", default_palette );

float anim=0;
               for(;
               {

                               while(speed>0)
                               {
                                               clear_to_color(bufor, makecol(255,255,255));
                                               {
                                                               short frame = (int)anim;
                                                               masked_blit(bufor, ludek[frame], 0, 0, 100, 100, ludek[frame]->w, ludek[frame]->h);
                                               }
                                               if(key[KEY_RIGHT]) anim+=0.01; //dostosuj sobie, im mniejsza wartość tym wolniejsza animacja
                                                                                                                 else anim = 0;
                                               if(anim>=9) anim = 1;
                                               blit(screen, bufor, 0, 0, 0, 0, bufor->w, bufor->h);
                                               speed=0;
                               }
               }
return 0;
}
END_OF_MAIN(); //nie wiem dlaczego to jest wymagane przez allegro, ale musi być. pewnie to powodowało error

Opublikowano

Ok, dzięki. W tej chwili kod kompiluje się, a ja muszę tylko zrobić grafikę. Dziękuję wszystkim za wypowiedź a szczególnie Sopelek997 :) Widzę, że przede mną jeszcze dużo nauki C++. Chyba przyda mi się powtórzenie całego kursu ^^

Kocham mame

Opublikowano

na stronie allegro.cc jest pełna dokumentacja allegro (i nie tylko) i polecam Ci z niej korzystać, bo z samych tutów o allegro na cpp0x wyniesiesz tylko podstawowe informacje

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...