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

[Allegro] Poruszanie po mapie kafelkowej

Ostatnio zmodyfikowano 2011-05-24 17:24
Autor Wiadomość
Wrzochu
Temat założony przez niniejszego użytkownika
[Allegro] Poruszanie po mapie kafelkowej
» 2011-05-24 12:52:01
Tak, wiem temat mapy kafelkowej był już wałkowany z tysiąc razy ale nie znalazłem odpowiedzi na mój problem...
A Chodzi mi dokładnie o poruszanie się po mapie kafelkowej a dokładnie aby auto poruszało się wyłącznie po drodze. Zrobiłem mapę i pasy ruchu na drodze są osobnymi kafelkami i mój problem polega na tym, że nie wiem jak zrobić aby auto się poruszało po tych kafelkach po których może.
Dołączam Screena wycinka mapy oraz kod programu. Kod jest pisany na podstawie tutoriala Easykoder'a.

Mapa:

http://imageshack.us/photo/my-images/811/mapaaaaaa.png/

Kod programu:

C/C++
#include <allegro.h>

// Inicjowanie timera
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0;
int autoo_x = mapa_x + 130, autoo_y = mapa_y + 200;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;
BITMAP * autoo = NULL;


// DEFINICJA MAPY
short int map[ 120 ][ 120 ] =
{
   
    // Nie wklejam całej mapy bo jest spora.
   
   
};

// Funkcja wyświetlająca mapę:
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 120; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 120; licznik_y++ )
        {
            blit( teren, bufor,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 8 ) * 20,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 8 ) * 20,
            licznik_x * 20, licznik_y * 20, 20, 20 );
        }
    }
};

// Funkcja Główna
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 40 ) );
   
    // Tworzenie bufora
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    // Ładowanie grafiki
    teren = load_bmp( "teren.bmp", default_palette );
    autoo = load_bmp( "autoo.bmp", default_palette );
   
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            // SCROLLOWANIE MAPY
            if(( key[ KEY_RIGHT ] ) &&( mapa_x < 80 ) ) { mapa_x = mapa_x + 1; } else
            if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else
            if(( key[ KEY_DOWN ] ) &&( mapa_y < 80 ) ) { mapa_y = mapa_y + 1; } else
            if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
           
            if( mapa_y > 20 )
            {
               
                if((( map[ mapa_y ][ mapa_x ] ) == 16 ) )
                {
                    autoo_y = autoo_y - 1;
                }
               
               
               
                speed--;
            }
           
            // Czyszczenie bufora
            clear_to_color( bufor, makecol( 150, 150, 150 ) );
           
            // Wyświetlanie mapy
            wys_mape();
            textprintf_ex( bufor, font, 10, 10, makecol( 255, 255, 255 ), - 1, "X: %d", mapa_x );
            textprintf_ex( bufor, font, 10, 20, makecol( 255, 255, 255 ), - 1, "Y: %d", mapa_y );
            masked_blit( autoo, bufor, 0, 0, autoo_x - 10, autoo_y - 20, autoo->w, autoo->h );
            blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
        }
        // Usuwanie wszystkiego z pamięci.
        remove_int( increment_speed );
        destroy_bitmap( teren );
        destroy_bitmap( autoo );
        destroy_bitmap( bufor );
        allegro_exit();
        return 0;
    }
    END_OF_MAIN();

Zapomniałem dodać, że jak przesuwam mapę to auto mi się porusza wraz z przesuwającą mapa. A chce aby auto na "stałe" było na mapie i poruszało się tylko po drodze.

Z góry dzięki za wszelką pomoc.
P-33397
DejaVu
» 2011-05-24 13:18:50
Warunek:
C/C++
if( nastepne_pole_samochodu( jest_droga ) )
     przesun_samochod_na_pole();

Jeżeli chodzi Ci o dokładne dopasowanie to sprawa nie jest prosta - poczytaj o algorytmach kolizji.
P-33398
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-05-24 13:26:19
No, ok ale chodzi o to, że mi nie wykrywa na jakim polu aktualnie się znajduje tylko auto przesuwa się wraz z widokiem mapy tzn jak steruje strzałkami aby poruszać się po mapie to to auto przesuwa się wraz z widokiem a nie pozostaje na drodze.
Załączam screena:
http://imageshack.us/photo/my-images/714/mapa2fu.png/
 scren zrobiony po przesunięciu mapy.
P-33399
SeaMonster131
» 2011-05-24 14:32:10
to auto przesuwa się wraz z widokiem a nie pozostaje na drodze

C/C++
if( mapa[ fura.y ][ fura.x + 1 ] == droga && klawisz_prawo )
     przesun_mape_w_prawo();

if( mapa[ fura.y ][ fura.x - 1 ] == droga && klawisz_lewo )
     przesun_mape_w_lewo();

o coś takiego chodzi?

Czy takiego:

C/C++
if( klawisz_prawo )
{
    if( mapa[ fura.y ][ fura.x + 1 ] == droga )
         przesun_fure_w_prawo();
   
    przesun_mape_w_prawo();
}
P-33401
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-05-24 15:55:34
Chodzi o to aby widok mapy się przesuwał, a auto zostało na mapie. Może nie jasno wyjaśniłem ale chce zrobić tak jak to jest w grach samochodowych, że jest mapa po której "same" jeżdżą samochody po drogach, a ty sterujesz jednym i widok mapy podąża za twoim autem, natomiast pozostałe niezależnie jeżdżą po drogach. A mój problem polega na tym, że nie mogę zrobić aby te auta się poruszały po mapie niezależnie od ruchu "widoku". Mam nadzieje, że teraz jasno wyjaśniłem o co mi chodzi,
i jeszcze raz dziękuje za pomoc.
P-33403
DejaVu
» 2011-05-24 16:03:02
Renderujesz cały świat, gdzie każdy obiekt ma swoje położenie globalne. Potem ustawiasz kamerę na właściwe miejsce. W allegro się po prostu rysuje obiekty na innym położeniu np.
C/C++
for( int i = 0; i < ileSamochodow; i++ )
{
    rysujNaEkran( samochod[ i ].bitmapa, samochod[ i ].x - kamera.x, samochod[ i ].y - kamera.y );
} //for
P-33404
SeaMonster131
» 2011-05-24 16:03:02
# Kurcze, ciachnęło mi całą wiad :P
Ale napisałem tak jak Pan DejaVu, że musisz to mniej więcej tak rysować:

masked_blit( autoo, bufor, 0, 0, autoo_x - mapa_x, autoo_y - mapa_y, autoo->w, autoo->h );

/edit (by DejaVu):
Przywróciłem wiadomość:

Hmm...to możesz zrobić tak:

C/C++
rysuj_fure( fura.x - mapa_x, fura.y - mapa_y );

//czyli:

masked_blit( autoo, bufor, 0, 0, autoo_x - mapa_x, autoo_y - mapa_y, autoo->w, autoo->h );

Aczkolwiek nie wiem czy to zadziała, możesz spróbować ^^ :)
P-33405
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-05-24 17:24:13
Zgadza się tak jak pisaliście trzeba było od położenia auta odjąć położenie kamery (autoo_x - mapa_x ) tylko jeszcze trza było przemnożyć przez wielkość obrazka czyli u mnie 20 bo tyle ma pikseli.

masked_blit( autoo, bufor, 0,0, autoo_x-mapa_x*20, autoo_y-mapa_y*20, autoo->w, autoo->h);

Ale dalej mi nie odczytuje poprawnie kafla pod którym się znajduje, bo jak widać auto w tym momencie znajduje sie na kaflu nr.16(jest to kafel z lewym pasem drogi) :

http://yfrog.com/z/e479911081p

Może dodam, że mapa składa się z bit mapy która jest podzielona 8x8 po 20 pikseli.
tak jak było pokazane w tutorialu Easykoder'a.

Wiec myślałem, że wystarczy warunek:

if((( map[mapa_y][mapa_x] ) == 16 )   )
              {
                   autoo_y = autoo_y - 1;
                   } 
 
i będzie działało, ale tak nie jest...

Już sobie poradziłem wystarczyło lekko zmodyfikować :

 if((( map[autoo_y/20][autoo_x/20] ) == 16 )   )
              {
                   autoo_y = autoo_y - 1;
                   }

Dziękuje za szybkie odpowiedzi.
 
P-33409
« 1 »
  Strona 1 z 1