polkom21 Temat założony przez niniejszego użytkownika |
[Allegro] Problem wczytywanie bitmap » 2012-12-15 23:49:37 Witajcie. Otóż zapaliłem się na stworzenie gry i piszę sobie wszystko powoli i mam problem z wyświetlaniem bitmap oznaczonych w mapie. Otóż problem mam z deklaracją bitmap. main.cpp #include <allegro.h> #include "global.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(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_keyboard(); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) ); BITMAP * buffor = NULL; buffor = create_bitmap( 800, 600 ); BITMAP * person = NULL; person = create_bitmap( 40, 40 ); clear_to_color( person, makecol( 0, 0, 0 ) ); BITMAP * object1 = NULL; object1 = create_bitmap( 40, 40 ); clear_to_color( object1, makecol( 0, 0, 255 ) ); BITMAP * object2 = NULL; object2 = create_bitmap( 40, 40 ); clear_to_color( object2, makecol( 255, 0, 0 ) ); int person_x = 100, person_y = 100; int rozmiar_x = 0, rozmiar_y = 0; const char * filemap = "map.txt"; int map[ 100 ][ 100 ]; LoadMap( filemap, map ); DrowMap( map, rozmiar_x, rozmiar_y ); while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] ) person_x--; if( key[ KEY_RIGHT ] ) person_x++; if( key[ KEY_UP ] ) person_y--; if( key[ KEY_DOWN ] ) person_y++; speed--; } show_position( person_x, person_y ); clear_to_color( buffor, makecol( 255, 255, 255 ) ); masked_blit( person, buffor, 0, 0, person_x, person_y, person->w, person->h ); blit( buffor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( object1 ); destroy_bitmap( object2 ); destroy_bitmap( person ); destroy_bitmap( buffor ); allegro_exit(); return 0; } END_OF_MAIN();
global.h #ifndef GLOBAL_H_INCLUDED #define GLOBAL_H_INCLUDED
#include "console.h" #include <fstream>
using namespace std;
int loadCounterX = 0, loadCounterY = 0, mapSizeX, mapSizeY;
void LoadMap( const char * filename, int map[ 100 ][ 100 ] ) { fstream plik; plik.open( filename, ios::in ); int rozmiar_x, rozmiar_y; plik >> rozmiar_x >> rozmiar_y; for( int x = 0; x < rozmiar_x; x++ ) { for( int y = 0; y < rozmiar_y; y++ ) { plik >> map[ x ][ y ]; } } plik.close(); }
void DrowMap( int map[ 100 ][ 100 ], int sizeMapX, int sizeMapY ) { for( int x = 0; x < sizeMapX; x++ ) { for( int y = 0; y < sizeMapY; y++ ) { if( map[ x ][ y ] == 0 ) { blit( obrazek1, buffor, x * 40, y * 40, 40, 40, 40, 40 ); } else if( map[ x ][ y ] == 1 ) { blit( obrazek2, buffor, x * 40, y * 40, 40, 40, 40, 40 ); } } } }
#endif
Jak by ktoś mi poradził jak to zrobić to bym był wdzięczny. |
|
SeaMonster131 |
» 2012-12-16 11:54:08 Mapę powinieneś wyświetlać w pętli głównej gry, a co do bitmap, to w funkcji DrowMap() masz zmienne obrazek1 oraz obrazek2 , które nie są nigdzie zadeklarowane. PS. Co do nazwy funkcji, to nie powinna się ona nazywać Dr awMap()? ;) |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-16 12:41:14 No dobra zrobiłem tak tą funkcje: void DrawMap( int map[ 100 ][ 100 ], int sizeMapX, int sizeMapY, BITMAP * buffor, BITMAP * obrazek1, BITMAP * obrazek2 ) { for( int x = 0; x < sizeMapX; x++ ) { for( int y = 0; y < sizeMapY; y++ ) { if( map[ x ][ y ] == 0 ) { blit( obrazek1, buffor, x * 40, y * 40, 40, 40, 40, 40 ); } else if( map[ x ][ y ] == 1 ) { blit( obrazek2, buffor, x * 40, y * 40, 40, 40, 40, 40 ); } } } }
i przeniosłem ją do pętli gry i błędów żadnych nie wyrzuca ale problem jest taki, że nie wyświetla mi nic z mapy tak jak powinno być :/ |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-17 01:29:41 Chyba znalazłem błąd. Tylko nie wiem jak go rozwiązać. Otóż mapa wygląda w ten sposób: 20 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 i funkcja wczytywania mapy wygląda tak: void LoadMap( const char * filename, int map[ 100 ][ 100 ], int rozmiar_x, int rozmiar_y ) { fstream plik; plik.open( filename, ios::in ); plik >> rozmiar_x >> rozmiar_y; for( int x = 0; x < rozmiar_x; x++ ) { for( int y = 0; y < rozmiar_y; y++ ) { plik >> map[ x ][ y ]; } } plik.close(); }
i otóż mam dylemat w jaki sposób zwrócić zmienne rozmiar_x i rozmiar_y do głównego kodu gry bo sprawdziłem i wynoszą one po 0 a powinien x=20 a y=15 W logach żadnych błędów nie mam i w tym największy problem bo tak to wiedział bym co robić a tak to muszę zwracać się do Was o pomoc. |
|
DejaVu |
» 2012-12-17 02:03:20 |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-17 13:06:33 No dobra w chwili obecnej wygląda to tak: main.cpp #include <allegro.h> #include "global.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(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_keyboard(); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) ); BITMAP * buffor = NULL; buffor = create_bitmap( 800, 600 ); BITMAP * person = NULL; person = create_bitmap( 40, 40 ); clear_to_color( person, makecol( 0, 0, 0 ) ); int person_x = 100, person_y = 100; int rozmiar_x = 0, rozmiar_y = 0; const char * filemap = "map.txt"; int map[ 100 ][ 100 ]; LoadMap( filemap, map, rozmiar_x, rozmiar_y ); cout << "map X: " << rozmiar_x << " map Y: " << rozmiar_y << endl; DrawMap( map, rozmiar_x, rozmiar_y, buffor ); while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] ) person_x--; if( key[ KEY_RIGHT ] ) person_x++; if( key[ KEY_UP ] ) person_y--; if( key[ KEY_DOWN ] ) person_y++; speed--; } show_position( person_x, person_y ); clear_to_color( buffor, makecol( 255, 255, 255 ) ); masked_blit( person, buffor, 0, 0, person_x, person_y, person->w, person->h ); blit( buffor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( person ); destroy_bitmap( buffor ); allegro_exit(); return 0; } END_OF_MAIN();
global.h #ifndef GLOBAL_H_INCLUDED #define GLOBAL_H_INCLUDED
#include "console.h" #include <fstream>
using namespace std;
int loadCounterX = 0, loadCounterY = 0, mapSizeX, mapSizeY;
void LoadMap( const char * filename, int map[ 100 ][ 100 ], int & rozmiar_x, int & rozmiar_y ) { fstream plik; plik.open( filename, ios::in ); plik >> rozmiar_x >> rozmiar_y; for( int x = 0; x < rozmiar_x; x++ ) { for( int y = 0; y < rozmiar_y; y++ ) { plik >> map[ x ][ y ]; } } plik.close(); }
void DrawMap( int map[ 100 ][ 100 ], int sizeMapX, int sizeMapY, BITMAP * buffor ) { for( int x = 0; x < sizeMapX; x++ ) { for( int y = 0; y < sizeMapY; y++ ) { int positionX = x * 40, positionY = y * 40; if( map[ x ][ y ] == 0 ) { } else if( map[ x ][ y ] == 1 ) { line( buffor, 400, 200, 600, 400, makecol( 255, 128, 64 ) ); } } } }
#endif
i problem jest teraz taki, że nie wyświetla mi tej linii i nie mam pojęcia czemu. |
|
DejaVu |
» 2012-12-17 13:18:52 Hm... może dlatego, że najpierw wyświetlasz mapę, później czyścisz ekran i wyświetlasz bufor? :P
PS. jeden temat = jeden problem :) |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-17 13:34:30 Dobra jak na razie wszystko działa. Dzięki bardzo za pomoc :) |
|
« 1 » |