bingo009 Temat założony przez niniejszego użytkownika |
[Allegro, C++] Błędne wyświetlanie mapy kafelkowej » 2011-07-18 19:10:50 Witam was serdecznie, otóż piszę sobie grę i mam problem. Korzystam z wyświetlania mapy według Easy Kodera, i działa lecz są błędy. Oto kod(cały, bo i tak jest go nie wiele): #include <allegro.h>
BITMAP * kafelkimap = NULL; int mapa_y = 0, mapa_x = 0;
short int map[ 2 ][ 4 ] = { 2, 3, 5, 6, 1.7, 8, 4 };
int init() { allegro_init(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_keyboard(); install_mouse(); kafelkimap = load_bmp( "map.bmp", default_palette ); if( !kafelkimap ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Error while loading map.bmp!!" ); allegro_exit(); return 0; } };
void wys_mape() { int licznik_x, licznik_y; for( licznik_x = 0; licznik_x < 10; licznik_x++ ) { for( licznik_y = 0; licznik_y < 5; licznik_y++ ) { blit( kafelkimap, screen, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 2 ) * 40, licznik_x * 40, licznik_y * 40, 40, 40 ); } } };
inline void deinit() { clear_keybuf(); allegro_exit(); }
int main() { init(); while( !key[ KEY_ESC ] ) { wys_mape(); } deinit(); return 0; } END_OF_MAIN();
Bitmana z terenem: Podział na kafle: Screen z gry: Proszę o pomoc. |
|
SeaMonster131 |
» 2011-07-18 22:06:56 Zrób coś na wzór tego: int szerokoscMapy = 2; int dlugoscMapy = 3;
int map[ dlugoscMapy ][ szerokoscMapy ] = { 1, 2, 3, 4, 5, 6 };
void Wyswietl_mape() { for( int y = 0; y < dlugoscMapy; y++ ) { for( int x = 0; x < szerokoscMapy; x++ { if( map[ y ][ x ] == 0 ) { rysuj_to( x * szerokoscKafelka, y * dlugoscKafelka ); } } } } |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2011-07-19 10:51:38 Nie pomogło, dalej są błędy i obraz skacze. Kod dla sprawdzenia(może to ja popełniłem błąd) void wys_mape() { for( int y = 0; y < 5; y++ ) { for( int x = 0; x < 20; x++ ) { if( map[ y ][ x ] == 0 ) { blit( kafelkimap, screen, 0, 0, x * 40, y * 40, kafelkimap->w, kafelkimap->h ); } } } };
|
|
malan |
» 2011-07-19 11:05:00 Ja tu czegoś nie rozumiem. Masz mapę 2x4, a rysujesz 10x5? |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2011-07-19 11:34:32 Jak rysuje mape 4x2 to nic się nie wyświetla. |
|
malan |
» 2011-07-19 12:44:23 1. Po definicji funkcji nie stawiamy średnika. 2. set_color_depth( 16 ); popraw na set_color_depth( 32 ); 3. void wys_mape() { int licznik_x, licznik_y; for( licznik_x = 0; licznik_x < 10; licznik_x++ ) { for( licznik_y = 0; licznik_y < 5; licznik_y++ ) { blit( kafelkimap, screen, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 2 ) * 40, licznik_x * 40, licznik_y * 40, 40, 40 ); } } }; Można to zapisać trochę inaczej :) void drawMap() { for( int x = 0; x < 4; x++ ) { for( int y = 0; y < 2; y++ ) { blit( kafelkimap, screen, ( map[ y + mapa_y ][ x + mapa_x ] % 4 ) * 40, ( map[ y + mapa_y ][ x + mapa_x ] / 4 ) * 40, x * 40, y * 40, 40, 40 ); } } } ...to raz. 3.2 ( map[ y + mapa_y ][ x + mapa_x ] % 4 ) * 40, ( map[ y + mapa_y ][ x + mapa_x ] / 2 ) * 40, Nie / 2 tylko / 4 - tutaj chodzi o ilość kafli w rzędzie (przynajmniej tak wywnioskowałem). 3.3 Jakby to ująć... Nie możesz rysować mapy większej niż "zadeklarowana". Utworzyłeś sobie mapę 2x4, a próbujesz wyświetlić 10x5. 4. Chyba najważniejsze. Kafle numerujemy od zera!Mapka ze screena: short int map[ 4 ][ 10 ] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 7, 6 }; |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2011-07-19 17:31:30 Dziękuję za odpowiedź, ale już sobie poradziłem z kodem Easy Codera. Otóż działa nieco dziwne, bo jak wpisze 0 to jest 1, a jak wpiszę 3, to jest 4, lecz to nie problem. Jednak dałeś mi bardzo ciekawe i przydatne rady, toteż ci za to dziękuję, napewno skorzystam na przyszłość. |
|
« 1 » |