dyzzioo Temat założony przez niniejszego użytkownika |
[Allegro, C++] Problem z wyświetlaniem bitmapy » 2010-05-30 18:38:20 Witam, podstawy programowania pojmuję i ostatnimi czasy zacząłem bawić sie w allegro i aktualnie borykam się z takim problemem. Otóż: napisalem program który wczytuje mi bufor, nastepnie tlo a na końcu powinien wczytac postac która będzie znajdować się na owym tle. Lecz jej nie ma i tu jest problem. Nie wiem co zrobić by ją wyświetlić. Oto kod :) Prosze o pomoc. #include<allegro.h>
class Cpostac { public: int x, y; short int kierunek, klatka; };
Cpostac postac;
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(); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) ); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); set_palette( default_palette ); clear_to_color( screen, makecol( 0, 0, 60 ) ); textout_ex( screen, font, "Projekt 'Gra I'", 600, 0, makecol( 0, 250, 250 ), - 1 ); BITMAP * postacb = NULL; BITMAP * bufor = NULL; BITMAP * tlo = NULL; bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Za malo pamieci potrzebnej do stworzenia bufora ekranu !\n" ); allegro_exit(); return 0; } tlo = load_bmp( "mapka.bmp", default_palette ); blit( tlo, screen, 0, 0, 0, 0, 800, 600 ); postacb = load_bmp( "postac.bmp", default_palette ); int frame = 0; postac.x = 100, postac.y = 100, postac.klatka = 0, postac.kierunek = 0; while( !key[ KEY_ESC ] ); { while( speed > 0 ) { postac.klatka = 0; if( key[ KEY_LEFT ] ) { postac.klatka = 2; postac.x -= 2; } if( key[ KEY_RIGHT ] ) { postac.klatka = 3; postac.x += 2; } if( key[ KEY_UP ] ) { postac.klatka = 4; postac.y -= 2; } if( key[ KEY_DOWN ] ) { postac.klatka = 1; postac.y += 2; } speed--; frame++; if( frame > 60 ) frame = 0; } clear_to_color( bufor, makecol( 250, 0, 250 ) ); if( frame < 20 ) { postac.kierunek = 0; } if( frame >= 20 && frame < 40 ) { postac.kierunek = 1; } if( frame >= 40 && frame < 60 ) { postac.kierunek = 2; } } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); masked_blit( bufor, postacb, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 ); remove_int( increment_speed ); destroy_bitmap( bufor ); destroy_bitmap( postacb ); destroy_bitmap( tlo ); allegro_exit(); return 0; } END_OF_MAIN(); |
|
Patzick |
» 2010-05-30 18:51:19 Bo zjadłeś klamrę, i dałeś ; za while...poza tym wyświetlasz najpierw bufor na ekran potem ludzika na bufor co nic nie daje. Lekkie poprawki, przeanalizuj sobie while( !key[ KEY_ESC ] ) { while( speed > 0 ) { postac.klatka = 0; if( key[ KEY_LEFT ] ) { postac.klatka = 2; postac.x -= 2; } if( key[ KEY_RIGHT ] ) { postac.klatka = 3; postac.x += 2; } if( key[ KEY_UP ] ) { postac.klatka = 4; postac.y -= 2; } if( key[ KEY_DOWN ] ) { postac.klatka = 1; postac.y += 2; } speed--; frame++; if( frame > 60 ) frame = 0; } clear_to_color( bufor, makecol( 250, 0, 250 ) ); if( frame < 20 ) { postac.kierunek = 0; } if( frame >= 20 && frame < 40 ) { postac.kierunek = 1; } if( frame >= 40 && frame < 60 ) { postac.kierunek = 2; } }
masked_blit( bufor, postacb, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 );
blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
}
remove_int( increment_speed ); destroy_bitmap( bufor ); destroy_bitmap( postacb ); destroy_bitmap( tlo );
//EDIT: powinieneś jeszcze czyścić bufor ale do tego już sobie dojdziesz czytając uważnie kurs Allegro |
|
dyzzioo Temat założony przez niniejszego użytkownika |
» 2010-05-30 19:04:09 Zerknij na to teraz. Powinno działac? Bufor mam czyscic jeszcze po wyświetleniu postaci na ekran, na koncu drugiej petli while? #include<allegro.h>
class Cpostac { public: int x, y; short int kierunek, klatka; };
Cpostac postac;
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(); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) ); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); set_palette( default_palette ); clear_to_color( screen, makecol( 0, 0, 60 ) ); textout_ex( screen, font, "Projekt 'Gra I'", 600, 0, makecol( 0, 250, 250 ), - 1 ); BITMAP * postacb = NULL; BITMAP * bufor = NULL; BITMAP * tlo = NULL; bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Za malo pamieci potrzebnej do stworzenia bufora ekranu !\n" ); allegro_exit(); return 0; } tlo = load_bmp( "mapka.bmp", default_palette ); blit( tlo, screen, 0, 0, 0, 0, 800, 600 ); postacb = load_bmp( "postac.bmp", default_palette ); int frame = 0; postac.x = 100, postac.y = 100, postac.klatka = 0, postac.kierunek = 0; while( !key[ KEY_ESC ] ); { while( speed > 0 ) { postac.klatka = 0; if( key[ KEY_LEFT ] ) { postac.klatka = 2; postac.x -= 2; } if( key[ KEY_RIGHT ] ) { postac.klatka = 3; postac.x += 2; } if( key[ KEY_UP ] ) { postac.klatka = 4; postac.y -= 2; } if( key[ KEY_DOWN ] ) { postac.klatka = 1; postac.y += 2; } speed--; frame++; if( frame > 60 ) frame = 0; } clear_to_color( bufor, makecol( 250, 0, 250 ) ); if( frame < 20 ) { postac.kierunek = 0; } if( frame >= 20 && frame < 40 ) { postac.kierunek = 1; } if( frame >= 40 && frame < 60 ) { postac.kierunek = 2; } masked_blit( postacb, bufor, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( bufor ); destroy_bitmap( postacb ); destroy_bitmap( tlo ); allegro_exit(); return 0; } END_OF_MAIN(); |
|
Patzick |
» 2010-05-30 19:14:40 dałeś jeszcze raz to samo. Nie leń się tylko przeanalizuj kod który Ci dałem, a o czyszczeniu bufora poczytaj w kursie. Nikt Ci nie będzie dawał ciągle gotowych rozwiązań, do tego trzeba wysiłku. |
|
ison |
» 2010-05-30 19:26:05 Patzick, pewnie nie zauwazyles ale w twoim kodzie tez jest błąd ;) w tym miejscu: masked_blit( bufor, postacb, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 );
zapomniałeś o kolejności argumentów, najpierw podaje się bitmape jaką chcesz rysować a potem na jakiej bitmapie. A u ciebie rysowany jest bufor na bitmapie postaci |
|
Patzick |
» 2010-05-30 19:39:20 masz rację :) to dlatego, że nie kompilowałem tego i byłem przekonany, że on kolejność argumentów ma dobrą, skupiłem się na bardziej rzucających się w oczy błędach xD |
|
dyzzioo Temat założony przez niniejszego użytkownika |
» 2010-05-30 19:46:13 Okej, robie tak że po kazdym przebiegu głownej pętli while czyszcze bufor, a po tym zapisuje obraz postaci na buforze, a bufor wyswietlam na screen i wciaż nie ma sladu po postaci. Wiec albo wczytuje mi ją pod tlo albo w ogóle jej nie wczytuje lub jescze jest gdzies poza planszą. Ma ktos jakis pomysł? patrząc na ten kod powyżej ? |
|
dyzzioo Temat założony przez niniejszego użytkownika |
» 2010-05-31 15:59:05 Czy jest możliwość, że przy takim kodzie program nie wchodzi w pętlę? Bo gdy nacisnąłem esc zobaczyłem(doslownie ulamek sekundy), że pogram wyświetlił tlo i postac. Zastanawiam się więc dlaczego nie wyświetla jej wciąć skoro blit z buforem jest wpisany w pętle while( key[KEY_ESC]) a po kazdym przejsciu bufor jest czyszczony. postac.x = 100; postac.y = 100; int frame = 0; postac.klatka = 0; postac.kierunek = 0; while( !key[ KEY_ESC ] );
{ while( speed > 0 ) { postac.klatka = 0; if( key[ KEY_LEFT ] ) { postac.kierunek = 2; postac.x -= 2; } else if( key[ KEY_RIGHT ] ) { postac.kierunek = 3; postac.x += 2; } else if( key[ KEY_UP ] ) { postac.kierunek = 4; postac.y -= 2; } else if( key[ KEY_DOWN ] ) { postac.kierunek = 1; postac.y += 2; } speed--; frame++; if( frame > 60 ) frame = 0; } clear_to_color( bufor, makecol( 255, 255, 255 ) ); if( frame < 20 ) { postac.klatka = 0; } if( frame >= 20 && frame < 40 ) { postac.klatka = 1; } if( frame >= 40 && frame < 60 ) { postac.klatka = 2; } masked_blit( tlo, bufor_tlo, 0, 0, 0, 0, 800, 600 ); masked_blit( postacb, bufor, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 100, 100 ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); blit( bufor_tlo, screen, 0, 0, 0, 0, 800, 600 ); }
|
|
« 1 » 2 |