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

[Allegro] Problem z animacją i mapą

Ostatnio zmodyfikowano 2008-07-10 14:45
Autor Wiadomość
ecpp-mateusz
Temat założony przez niniejszego użytkownika
[Allegro] Problem z animacją i mapą
» 2008-07-10 12:56:32
Udało mi się jakoś połączyć animacje i wyświetlanie mapy.Dało się skompilować i uruchomić - i tutaj pies zagrzebany.Gdy właczam "grę" to tylko czarne tło ,bez mapy i ludzika i po tym następuje błąd i aplikacja się zawiesza i zamyka.Jeśli ktoś mógłby spojrzeć na kod i napisał jakie błędy popełniłem bardzo bym dziękował.

Zadanie: wybrałem Allegro do tego celu ,żeby napisać coś podobnego do GTA tylko że nie aż takie wielkie mapy;].

Kod :

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

class Cpostac
{
public:
    int x, y;
    short int kierunek, klatka;
};
// Zmienna naszej klasy
Cpostac ludek;

// Inicjowanie timera

// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;

// DEFINICJA MAPY
short int map[ 10 ][ 20 ] =
{
    15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 4, 9, 10, 10, 10, 8, 3, 5, 15, 0, 2, 2, 2, 1, 15,
    2, 1, 15, 15, 15, 15, 7, 10, 10, 10, 6, 15, 15, 15, 7, 10, 10, 10, 6, 15,
    10, 6, 15, 15, 15, 15, 4, 9, 10, 10, 6, 15, 15, 15, 4, 3, 3, 3, 5, 15,
    10, 12, 2, 1, 15, 15, 15, 7, 10, 8, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    10, 10, 10, 6, 15, 15, 15, 4, 3, 5, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2,
    10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2, 13, 10, 10,
    3, 3, 3, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 10, 10, 10, 8, 3,
    15, 15, 15, 15, 15, 0, 1, 15, 15, 15, 15, 15, 0, 2, 13, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 4, 5, 15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 6, 15
};

// Funkcja wyświetlająca mapę:
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( teren, bufor,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 4 ) * 40,
            licznik_x * 40, licznik_y * 40, 40, 40 );
        }
    }
};

// Funkcja Główna
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 40 ) );
   
    // Tworzenie bufora
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    // Ładowanie grafiki
    BITMAP * bufor = NULL;
    BITMAP * ludekb = NULL;
    ludekb = load_bmp( "postac.bmp", default_palette );
    teren = load_bmp( "teren.bmp", default_palette );
   
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            // Ustalanie początkowej pozycji ludzika
            int frame = 0;
            ludek.x = 100;
            ludek.y = 100;
            ludek.klatka = 0;
            ludek.kierunek = 0;
           
            ludek.kierunek = 0;
            if( key[ KEY_LEFT ] ) { ludek.kierunek = 4; ludek.x -= 2; }
            if( key[ KEY_RIGHT ] ) { ludek.kierunek = 2; ludek.x += 2; }
            if( key[ KEY_UP ] ) { ludek.kierunek = 1; ludek.y -= 2; }
            if( key[ KEY_DOWN ] ) { ludek.kierunek = 3; ludek.y += 2; }
            speed--;
           
            // Sterowanie animacją
            if( frame < 20 ) { ludek.klatka = 0; }
            else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; }
           
            // SCROLLOWANIE MAPY
            if(( key[ KEY_RIGHT ] ) &&( mapa_x < 10 ) ) { 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 < 5 ) ) { mapa_y = mapa_y + 1; } else
            if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
            speed--;
        }
       
        //Wyświetlanie ludzika
        masked_blit( ludekb, bufor, ludek.kierunek * 60, ludek.klatka * 60, ludek.x, ludek.y, 60, 60 );
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
       
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        // Wyświetlanie mapy
        wys_mape();
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    // Usuwanie wszystkiego z pamięci.
    remove_int( increment_speed );
    destroy_bitmap( ludekb );
    destroy_bitmap( bufor );
    destroy_bitmap( teren );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-940
DejaVu
» 2008-07-10 13:03:31
Sprawdzałeś czy działa Ci najprostszy przykład w allegro? (narysowanie linii na ekranie i poczekanie na naciśnięcie klawisza).

/edit:
Dwa razy wywołujesz również tą linijkę, co jest błędne.
destroy_bitmap( bufor );
P-941
ecpp-mateusz
Temat założony przez niniejszego użytkownika
» 2008-07-10 14:12:09
Wcześniej już robiłem animacje(proste płynne ale to raczej latanie niż ruch) i działały.Teraz nie wiem co się stało z tym projektem.
P-942
DejaVu
» 2008-07-10 14:20:47
Ja dopiero późnym wieczorem będę mógł spojrzeć na ten kod. Jedyne co mogę Ci na chwilę obecną zaproponować to wykomentowywanie fragmentów kodu i sprawdzanie kiedy program przestanie się wywalać. Program może Ci się wysypywać nawet przez brak tekstur.

/edit:
Na wstępie wykomentowałbym poniższy wiersz i sprawdził czy program pracuje poprawnie:
wys_mape();
P-943
ecpp-mateusz
Temat założony przez niniejszego użytkownika
» 2008-07-10 14:37:44
Wcześniej zobaczyłem Animacja i Mapa z EasyKoder więc postanowiłem napisać grę.Gdy miałem odddzielnie wcześniej animacje "człowieka" i samochodu oraz małej mapy miasta to każde oddzielnie dobrze działało a jak teraz scaliłem to nie wiem czy dobrze.
P-944
DejaVu
» 2008-07-10 14:45:19
http://ddt.pl/forum/?Tid=172 No właśnie jakoś znajomo wyglądał ten kod :)
P-945
« 1 »
  Strona 1 z 1