czosnek17 Temat założony przez niniejszego użytkownika |
Problem z odwróconą mapą kafelkową » 2013-06-03 22:17:44 Po 3 godzinach dostałem ku#####. Poddaję się i wrzucam to na forum. Może wam się uda. Ważne fragmenty kodu: W funkcji main:
int map[ 8 ][ 8 ] = { { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 1, 0, 1, 0, 1, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 0, 0 }, { 1, 0, 0, 0, 0, 1, 0, 0 } }; obiekt mapa[ 8 ][ 8 ]; rysowanie_mapy( map, mapa );
for( int i = 0; i != mpx; i++ ) { for( int i2 = 0; i2 != mpx; i2++ ) { mapa[ i ][ i2 ].spr.setPosition( i * kls, i2 * kls ); okno.draw( mapa[ i ][ i2 ].spr ); } }
Funkcja rysowanie_mapy void rysowanie_mapy( int map[][ mpx ], obiekt mapa[][ mpx ] ) { int obp = 0; for( int i = 0; i != mpx; i++ ) { for( int i2 = 0; i2 != mpx; i2++ ) { if( map[ i ][ i2 ] == 0 ) { mapa[ i ][ i2 ].ckol = 1; } if( map[ i ][ i2 ] == 1 ) { mapa[ i ][ i2 ].ckol = 0; } obp++; } } }
Wygląda to tak: http://img203.imageshack.us/img203/374/63270315.pngWszystko działa (kolizje), ale jak widać jest odwrócone. Można temu zapobiec modyfikując linijkę z ostatniej pętli na mapa[ i2 ][ i ].spr.setPosition( i * kls, i2 * kls );
Mapa wyświetla się prawidłowo, ale kolizje pozostają tak jak na screenie. Nic dziwnego, jak nic nie zmieniam w funkcji rysowanie_mapy. Z tym mam właśnie problem. Co tam zmienić aby to zadziałało? Może to wydaje się proste, ale jak już wyżej pisałem męczyłem się nad tym dość długo. |
|
polkom21 |
» 2013-06-04 01:01:44 A tak ci się dzieje bo trochę odwrotnie zrobiłeś wszystko. Wczytywanie i rysowanie mapy powinno być tak: for( int y = 0; y < sizey; y++ ) { for( int x = 0; x < sizex; x++ ) { } }
No trochę źle się zabrałeś za to więc musisz poprawić. Bym Ci z chęcią wytłumaczył czemu tak się dzieje jak napisałeś tak kod ale ciężko jest mi to opisać :P Też miałem na początku taki sam problem jak Ty ale już się nauczyłem i nie mam z tym więcej problemu. |
|
palkoul |
» 2013-06-04 08:48:27 Zauważ, że gdy masz dwie pętle for (jedna w drugiej) to najpierw będzie wykonywała się pętla wewnętrzna i gdy wykona się cała, to pętla zewnętrzna wykona się jeden raz. Gdy rysujemy, najpierw rysujemy elementy poziomo i gdy narysujemy całą linie, schodzimy jeden element pionowo w dół. Czyli można wywnioskować, że pętla wewnętrzna będzie naszym X, a pętla zewnętrzna Y. Pozdrawiam i życzę powodzenia :] |
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2013-06-04 17:24:54 Zrobiłem tak jak mówicie ale dalej jest tak samo. for( int y = 0; y < mpy; y++ ) { for( int x = 0; x < mpx; x++ ) { mapa[ x ][ y ].spr.setPosition( x * kls, y * kls ); okno.draw( mapa[ x ][ y ].spr ); } }
A w funkcji pętle wyglądają tak: for( int y = 0; y < mpx; y++ ) { for( int x = 0; x < mpx; x++ ) {
Jedynym sposobem na poprawne wyświetlenie jest zamiana x i y w pętli funkcji main. Bym Ci z chęcią wytłumaczył czemu tak się dzieje jak napisałeś tak kod ale ciężko jest mi to opisać :P
|
Może spróbujesz? ;) |
|
RazzorFlame |
» 2013-06-04 20:14:48 Pierwsze nawiasy kwadratowe to ilość wierszy (Y) a drugi to ilość kolumn (X). |
|
Gabes |
» 2013-06-04 20:20:25 Odnośnie wyświetlania kafelków. const int mpx = 8, mpy = 6; int kls = 40;
int mapa[ mpy ][ mpx ] = { { 1, 0, 0, 1, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 1, 0, 0 }, { 0, 0, 0, 1, 0, 1, 0, 0 }, { 1, 1, 0, 1, 1, 1, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 1 } };
for( int y = 0; y < mpy; y++ ) { for( int x = 0; x < mpx; x++ ) { mapa[ y ][ x ].spr.setPosition( x * kls, y * kls ); okno.draw( mapa[ y ][ x ].spr ); } }
for( int x = 0; x < mpx; x++ ) { for( int y = 0; y < mpy; y++ ) { mapa[ y ][ x ].spr.setPosition( x * kls, y * kls ); okno.draw( mapa[ y ][ x ].spr ); } } Widać różnice gdy odległość między kafelkami jest mniejsza od jego wielkości kafelka. Nie ma to znaczenia gdy jest równa. kafelki Wyświetlanie jednego kafelka for( int y = 0; y < mpy; y++ ) { for( int x = 0; x < mpx; x++ ) { if( mapa[ y ][ x ] == 1 ) kafelek.setPosition( x * kls, y * kls ); okno.draw( kafelek ); } } |
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2013-06-05 19:30:48 Ok. Ale jak sprawić aby funkcja rysowanie_mapy dobrze ustawiała kolizje? Eksperymentowałem trochę i znowu kolizje zachowują się tak, jakby mapa była wyświetlana odwrotnie(kolumnami, tak jak przedtem). |
|
polkom21 |
» 2013-06-05 22:52:05 Weź ty zrób to jak człowiek wrzuć mapę do pliku w programie napisz algorytm do wczytywania mapy do tablicy int i dopiero bo kombinujesz niby tak niby nie tak. |
|
« 1 » 2 |