Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z odwróconą mapą kafelkową

Ostatnio zmodyfikowano 2013-06-06 20:28
Autor Wiadomość
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:
C/C++
/*
kls - szerokosc kafelka
mpx, mpy - szerokosc mapy (w ilosci kafelkow)
bool ckol - okresla czy z kafelkiem mozna sie zderzyc
*/
//...
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
C/C++
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].utexture(0); // ustawianie tekstury
                mapa[ i ][ i2 ].ckol = 1;
            }
           
            if( map[ i ][ i2 ] == 1 )
            {
                //mapa[i][i2].utexture(1); 
                mapa[ i ][ i2 ].ckol = 0;
            }
           
            obp++;
        }
       
    }
   
}

Wygląda to tak: http://img203.imageshack.us/img203/374/63270315.png
Wszystko działa (kolizje), ale jak widać jest odwrócone. Można temu zapobiec modyfikując linijkę z ostatniej pętli na
C/C++
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.
P-84779
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:
C/C++
for( int y = 0; y < sizey; y++ )
{
    for( int x = 0; x < sizex; x++ ) {
        // i tu podajesz rysowanie elementu wraz z pozycją
    }
}

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.
P-84791
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 :]
P-84796
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.
C/C++
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:
C/C++
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? ;)
P-84821
RazzorFlame
» 2013-06-04 20:14:48
Pierwsze nawiasy kwadratowe to ilość wierszy (Y) a drugi to ilość kolumn (X).
P-84857
Gabes
» 2013-06-04 20:20:25
Odnośnie wyświetlania kafelków.
C/C++
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, 0, 0, 1, 0, 1, 0, 0},
    //{ 1, 0, 0, 1, 0, 1, 0, 0},
    { 1, 1, 0, 0, 0, 0, 0, 1 }
};

//rysowanie rzędami
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 );
    }
}

/* rysowanie kolumnami */

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
C/C++
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 );
    }
}
P-84858
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).
P-84985
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.
P-85011
« 1 » 2
  Strona 1 z 2 Następna strona