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

[Allegro, C++] Błędne wyświetlanie mapy kafelkowej

Ostatnio zmodyfikowano 2011-07-19 17:31
Autor Wiadomość
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):
C/C++
#include <allegro.h>

//Zmienne
BITMAP * kafelkimap = NULL;
int mapa_y = 0, mapa_x = 0;


short int map[ 2 ][ 4 ] =
{
    2, 3, 5, 6,
    1.7, 8, 4
};



//Inicjalizacja
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;
    }
   
};

//Rysowanie mapy

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 );
        }
    }
};


//Wylaczanie
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.
P-36218
SeaMonster131
» 2011-07-18 22:06:56
Zrób coś na wzór tego:
C/C++
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 );
            }
            //itd
           
        }
       
    }
   
}
P-36224
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)
C/C++
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 );
            }
            //itd
           
        }
    }
};
P-36236
malan
» 2011-07-19 11:05:00
Ja tu czegoś nie rozumiem. Masz mapę 2x4, a rysujesz 10x5?
P-36237
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.
P-36240
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.
C/C++
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 :)
C/C++
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
C/C++
( 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:
C/C++
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
};
P-36247
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ść.
P-36267
« 1 »
  Strona 1 z 1