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

[Allegro, C++] Przemieszczanie

Ostatnio zmodyfikowano 2011-09-05 09:10
Autor Wiadomość
Wrzochu
Temat założony przez niniejszego użytkownika
[Allegro, C++] Przemieszczanie
» 2011-09-04 00:02:11
Witam, mam problem z funkcją odpowiedzialną za przemieszczanie "samochodu".
Jeśli miałby ktoś trochę czasu i chęci i zerknął co jest nie tak z kodem byłbym bardzo wdzięczny.

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



// Inicjowanie timera
volatile long speed = 0;
enum GAMESTATE { GS_NOTSTARTED, GS_MOVE, GS_LOSE, GS_ERROR, GS_EXIT };
GAMESTATE GS_GameState = GS_NOTSTARTED;

void increment_speed()
{
    speed++;
}

END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Zmienne potrzebne do mapy
// DEFINICJA MAPY

short int map[ 120 ][ 120 ] =
{
    //tu wypełniona jest tablica odpowiedzialna za  mapę kaflową
};

const int max_car = 3;
int x, y;
short int f = 0;
int mapa_x = 0, mapa_y = 0;
int autoo_x = 280, autoo_y = 200, autoo2_x = 280, autoo2_y = 180, autoo3_x = 280, autoo3_y = 160;
int kierunek = 0, kierunek2 = 0, kierunek3 = 0;
int frame, frame2;
int kolizja = 0;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;
BITMAP * autoo = NULL;
BITMAP * autoo2 = NULL;
BITMAP * autoo3 = NULL;
//BITMAP *menu  = NULL;

//KLASY

class cAuto
{
public:
    int x, y, i;
    BITMAP * autoo2;
   
    cAuto();
    ~cAuto();
    void rys_sam();
    void przemiesc_sam();
    bool ustaw_sam();
    //  bool Check_Conflict();
};

cAuto::cAuto()
{
   
    autoo2 = load_bmp( "autoo2.bmp", default_palette );
    srand( time( NULL ) );
    x = 120;
    y = 80;
   
}

cAuto::~cAuto()
{
    autoo2 = NULL;
    destroy_bitmap( autoo2 );
   
}

void cAuto::rys_sam()
{
    masked_blit( autoo2, bufor, 0, 0, x - mapa_x * 20, y - mapa_y * 20, 20, 20 );
    textprintf_ex( bufor, font, 10, 80, makecol( 255, 255, 255 ), - 1, "X: %d", x );
    textprintf_ex( bufor, font, 10, 90, makecol( 255, 255, 255 ), - 1, "Y: %d", y );
};

void cAuto::przemiesc_sam()
{
    if((( map[( y - 1 ) / 20 ][ x / 20 ] ) == 16 ) &&(( map[( y ) / 20 ][( x ) / 20 ] ) == 16 ) )
    {
        y = y - 1;
        // kierunek = 0;
    }
};



// 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 ) );
   
    //losowanie  frame
   
    //srand( time(NULL));
    //frame=rand () % 39+1;
   
    // 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 );
    autoo2 = load_bmp( "autoo.bmp", default_palette );
    autoo3 = load_bmp( "autoo.bmp", default_palette );
    // menu = load_bmp("menu.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 < 90 ) ) { mapa_y = mapa_y + 1; } else
            if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
            if( key[ KEY_Q ] ) { map[ 140 / 20 ][ 280 / 20 ] = 7; }
           
           
            speed--;
            frame++;
            frame2++;
            if( frame2 > 800 ) frame2 = 0;
           
            if( frame > 5 ) {
                frame = 2;
                srand( time( NULL ) );
                frame = rand() % 4 + 1;
            }
        }
       
        // Czyszczenie bufora
       
       
       
        // Wyświetlanie mapy
       
        wys_mape();
        cAuto sam[ 10 ];
        cAuto saam;
        saam.rys_sam();
        saam.przemiesc_sam();
       
        for( int i = 0; i < 10; ++i ) /* petla ktora ustawia i rysuje przeciwnikow*/
        {
            sam[ i ].i = i; // rowna licznik klasy zlicznikiem petli                           
            sam[ i ].x = 120;
            sam[ i ].y = 160;
            sam[ i ].rys_sam();
            sam[ i ].przemiesc_sam();
        };
       
        // sam.steruj_sam();
        // sam.ustaw_sam();
        masked_blit( autoo2, bufor, kierunek2 * 20, 0, autoo2_x - mapa_x * 20, autoo2_y - mapa_y * 20, 20, 20 );
        masked_blit( autoo3, bufor, kierunek3 * 20, 0, autoo3_x - mapa_x * 20, autoo3_y - mapa_y * 20, 20, 20 );
        masked_blit( autoo, bufor, kierunek * 20, 0, autoo_x - mapa_x * 20, autoo_y - mapa_y * 20, 20, 20 );
        // masked_blit( menu, bufor, 0,0, 0, 0, menu->w, menu->h);
        textprintf_ex( bufor, font, 10, 30, makecol( 255, 255, 255 ), - 1, "Licznik: %d", frame2 );
        textprintf_ex( bufor, font, 10, 10, makecol( 255, 255, 255 ), - 1, "X: %d", autoo_x );
        textprintf_ex( bufor, font, 10, 20, makecol( 255, 255, 255 ), - 1, "Y: %d", autoo_y );
        textprintf_ex( bufor, font, 10, 40, makecol( 255, 255, 255 ), - 1, "Mapa X: %d", mapa_x );
        textprintf_ex( bufor, font, 10, 50, makecol( 255, 255, 255 ), - 1, "Mapa Y: %d", mapa_y );
        textprintf_ex( bufor, font, 10, 60, makecol( 255, 255, 255 ), - 1, "KOLIZJA: %d", kolizja );
        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( autoo2 );
    destroy_bitmap( autoo3 );
    //destroy_bitmap(menu);
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Wiem, że kod jest strasznie chaotyczny ale próbowałem wiele rzeczy poprawić/testować ale i tak nie wiem co jest źle...
P-40464
malan
» 2011-09-04 02:21:16
O_O

Zmienne globalne... tysiące zmiennych globalnych!

Nie sprawdzasz, czy poprawnie wczytano bitmapy.

C/C++
cAuto sam[ 10 ];
cAuto saam;
saam.rys_sam();
saam.przemiesc_sam();

for( int i = 0; i < 10; ++i ) /* petla ktora ustawia i rysuje przeciwnikow*/
{
    sam[ i ].i = i; // rowna licznik klasy zlicznikiem petli                           
    sam[ i ].x = 120;
    sam[ i ].y = 160;
    sam[ i ].rys_sam();
    sam[ i ].przemiesc_sam();
};
Co to robi w głównej pętli?

C/C++
cAuto::~cAuto()
{
    autoo2 = NULL;
    destroy_bitmap( autoo2 );
   
}
Mamy zwycięzcę!

Jak się czepiać to się czepiać - klasa posiada metody, a nie funkcje.

Jak poprawisz to co wymieniłem to porozmawiamy o przemieszczeniu.

P-40467
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-09-04 09:40:20
Zmiennych globalnych było tyle bo wcześniej program pisany był nie obiektowo, teraz już z likwidowałem te które nie są potrzebne, to fakt klasa mam metody nie funkcje moje przejęzyczenie. Teraz tez już sprawdzam ładowanie bitmap chociaż skoro były widoczne na ekranie to raczej się ładowały ;)
Kod po wprowadzeniu poprawek:
C/C++
#include <allegro.h>
#include <cstdlib>
#include <ctime>



// Inicjowanie timera
volatile long speed = 0;
enum GAMESTATE { GS_NOTSTARTED, GS_MOVE, GS_LOSE, GS_ERROR, GS_EXIT };
GAMESTATE GS_GameState = GS_NOTSTARTED;

void increment_speed()
{
    speed++;
}

END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Zmienne potrzebne do mapy
// DEFINICJA MAPY

short int map[ 120 ][ 120 ] =
{
    //tu wypełniona jest tablica odpowiedzialna za  mapę kaflową
};


int x, y;
int mapa_x = 0, mapa_y = 0;
int frame, frame2;
int kolizja = 0;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;


//KLASY

class cAuto
{
public:
    int x, y, i;
    BITMAP * autoo2;
   
    cAuto();
    ~cAuto();
    void rys_sam();
    void przemiesc_sam();
    bool ustaw_sam();
   
};

cAuto::cAuto()
{
   
    autoo2 = load_bmp( "autoo2.bmp", default_palette );
    if( !autoo2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę załadować bitmapy !" );
        allegro_exit();
    }
   
    srand( time( NULL ) );
    x = 120;
    y = 80;
   
}

cAuto::~cAuto()
{
    destroy_bitmap( autoo2 );
    autoo2 = NULL;
   
}

void cAuto::rys_sam()
{
    masked_blit( autoo2, bufor, 0, 0, x - mapa_x * 20, y - mapa_y * 20, 20, 20 );
    textprintf_ex( bufor, font, 10, 10, makecol( 255, 255, 255 ), - 1, "X: %d", x );
    textprintf_ex( bufor, font, 10, 20, makecol( 255, 255, 255 ), - 1, "Y: %d", y );
};

void cAuto::przemiesc_sam()
{
    if((( map[( y - 1 ) / 20 ][ x / 20 ] ) == 16 ) &&(( map[( y ) / 20 ][( x ) / 20 ] ) == 16 ) )
    {
        y = y - 1;
    }
};



// 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 );
    if( !teren )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę załadować bitmapy !" );
        allegro_exit();
        return 0;
    }
   
    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 < 90 ) ) { mapa_y = mapa_y + 1; } else
            if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
            if( key[ KEY_Q ] ) { map[ 140 / 20 ][ 280 / 20 ] = 7; }
           
            speed--;
            frame++;
            frame2++;
            if( frame2 > 800 ) frame2 = 0;
           
            if( frame > 5 ) {
                frame = 2;
                srand( time( NULL ) );
                frame = rand() % 4 + 1;
            }
        }
       
        // Czyszczenie bufora
       
       
       
        // Wyświetlanie mapy
       
        wys_mape();
        cAuto sam[ 10 ];
        for( int i = 0; i < 10; ++i ) /* petla ktora ustawia i rysuje przeciwnikow*/
        {
            sam[ i ].i = i; // rowna licznik klasy zlicznikiem petli                           
            sam[ i ].x = 120;
            sam[ i ].y = 160;
            sam[ i ].rys_sam();
            sam[ i ].przemiesc_sam();
        };
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
   
    // Usuwanie wszystkiego z pamięci.
   
    remove_int( increment_speed );
    //~cAuto();
    destroy_bitmap( teren );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

A to miało być w formie destruktora... Ale znając moje umiejętności coś pomieszałem.
C/C++
cAuto::~cAuto()
{
    destroy_bitmap( autoo2 );
    autoo2 = NULL;
   
}
P-40469
Gabes
» 2011-09-04 13:27:21
Tak poprawdzie to nie napisałeś co chcesz ośiągnąć , ale myśle że tak:
-auto znajduje się na środku ekranu
-klawiaturą przewijasz auto-mape lewo,prawo,góra,dół
-obrót auta w 4 kierunkach za pomocą
rotate_sprite
-gdy przewiniesz mape do (0,0) lub (119,119) , przemieszczasz auto do krawędzi ekeanu
Pytanie za 100 litrów benzyny
Co ma robić autko?
-zabierać pieszych
-zbierać kanistry z benzyną
-rozjeżdżać pijanych rowerystów
-zatrzymywać się przed przeszkodami -dom -las -rzeka
-itd.-itp.
Prośba gdy napiszesz posta to czekaj na odpowiedź i dodatkowe pytania a nie zrywasz się z forum nikt nie udzieli ci pomocy gdy ty sam olewasz temat.
A tak swoją "drogą" dobry pomysł na mini gierke i trening w kodzeniu , lepszy nawet od kalkulatora z pierwiastkowaniem .



P-40474
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-09-04 14:19:32
Gabes, źle się zrozumieliśmy. Auto ogólnie ma się poruszać po takiej mapie :
I ogólnie  odpowiedzialne za to są warunki:
C/C++
if((( map[( y - 1 ) / 20 ][ x / 20 ] ) == 16 ) &&(( map[( y ) / 20 ][( x ) / 20 ] ) == 16 ) )
{
    y = y - 1;
}

Tylko w swoim programie mam ich wiele więcej tzn. rozpisane na każdy przypadek, a nie wklejałem ich bo myślę ze to nie ma sensu bo skoro zadziała na tym to na reszcie warunków tez będzie działać. Jeśli chodzi o kierunek problem tez rozwiązałem. Tylko, że wszystko działa pięknie i dobrze jak robię to na "sztywno" ze zmiennymi globalnymi. Natomiast jak dołączyłem klasę cAuto to wtedy się posypało.
A ogólnie problem mam taki ze auto nie "jeździ" tzn nie porusza się po wyznaczonych kaflach które są drogą.

Tak jak pokazałem wyżej w kodzie  warunek sprawdza czy współrzędne auta są na danym kaflu w tym wypadku "16" to może jechać w duł bo "16" jest odpowiedzialny za lewy pas. I tak jak pisałem jeśli nie używałem klas to auto jeździło tak jak chciałem.

//EDIT

Odpowiadając na twoje pytania:
- tak mapę przesuwamy za pomocą klawiatury,
- Auto nie znajduje się na środku ekranu tylko pod współrzędnymi x=120, y = 80;
- A co ma auto robić? Po prostu jeździć po drodze :D Jak już zacznie się poruszać samo to można kombinować dalej(zapomniałem dodać, że auto ma się samo poruszać, a nie tak jak to chyba zrozumiałeś, że będziemy nim sterować).

Zapoznaj się z » Kurs STC » Kolorowanie składniKolorowanie składni języka C++ lekcja
malan
P-40476
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-09-05 09:10:10
I nikt nie jest w stanie pomóc? :(
P-40535
« 1 »
  Strona 1 z 1