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

[Allegro, C++] Problem z wyświetlaniem bitmapy

Ostatnio zmodyfikowano 2010-05-31 23:28
Autor Wiadomość
dyzzioo
Temat założony przez niniejszego użytkownika
[Allegro, C++] Problem z wyświetlaniem bitmapy
» 2010-05-30 18:38:20
Witam, podstawy programowania pojmuję i ostatnimi czasy zacząłem bawić sie w allegro i aktualnie borykam się z takim problemem. Otóż: napisalem program który wczytuje mi bufor, nastepnie tlo a na końcu powinien wczytac postac która będzie znajdować się na owym tle. Lecz jej nie ma i tu jest problem. Nie wiem co zrobić by ją wyświetlić.  Oto kod :)  Prosze o pomoc.
C/C++
#include<allegro.h>

class Cpostac
{
public:
    int x, y;
    short int kierunek, klatka;
};

// Zmienna naszej klasy.
Cpostac postac;
//Timer.
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );


//Początek głównej funkcji.
int main()
{
    allegro_init();
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) );
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    set_palette( default_palette );
    clear_to_color( screen, makecol( 0, 0, 60 ) );
    textout_ex( screen, font, "Projekt 'Gra I'", 600, 0, makecol( 0, 250, 250 ), - 1 );
   
    //Deklaracja obrazów.
    BITMAP * postacb = NULL;
    BITMAP * bufor = NULL;
    BITMAP * tlo = NULL;
   
    // Tworzenie bufora
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Za malo pamieci potrzebnej do stworzenia bufora ekranu !\n" );
        allegro_exit();
        return 0;
    }
   
    //Ładowanie tła.
    tlo = load_bmp( "mapka.bmp", default_palette );
   
    blit( tlo, screen, 0, 0, 0, 0, 800, 600 );
    //Ładowanie grafiki.
    postacb = load_bmp( "postac.bmp", default_palette );
   
    //Ustawianie początkowej pozycji postaci.
    int frame = 0;
    postac.x = 100,
    postac.y = 100,
    postac.klatka = 0,
    postac.kierunek = 0;
   
    while( !key[ KEY_ESC ] );
   
    {
        while( speed > 0 )
        {
            postac.klatka = 0;
            if( key[ KEY_LEFT ] ) { postac.klatka = 2; postac.x -= 2; }
            if( key[ KEY_RIGHT ] ) { postac.klatka = 3; postac.x += 2; }
            if( key[ KEY_UP ] ) { postac.klatka = 4; postac.y -= 2; }
            if( key[ KEY_DOWN ] ) { postac.klatka = 1; postac.y += 2; }
            speed--;
           
            frame++;
            if( frame > 60 ) frame = 0; }
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 250, 0, 250 ) );
        // Sterowanie animacją
        if( frame < 20 ) { postac.kierunek = 0; }
        if( frame >= 20 && frame < 40 ) { postac.kierunek = 1; }
        if( frame >= 40 && frame < 60 ) { postac.kierunek = 2; }
    }
   
    //Wyświetlanie postaci.
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    masked_blit( bufor, postacb, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 );
   
   
   
    remove_int( increment_speed );
    destroy_bitmap( bufor );
    destroy_bitmap( postacb );
    destroy_bitmap( tlo );
   
   
   
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-17369
Patzick
» 2010-05-30 18:51:19
Bo zjadłeś klamrę, i dałeś ; za while...poza tym wyświetlasz najpierw bufor na ekran potem ludzika na bufor co nic nie daje. Lekkie poprawki, przeanalizuj sobie

C/C++
while( !key[ KEY_ESC ] )
{
    while( speed > 0 )
    {
        postac.klatka = 0;
        if( key[ KEY_LEFT ] ) { postac.klatka = 2; postac.x -= 2; }
        if( key[ KEY_RIGHT ] ) { postac.klatka = 3; postac.x += 2; }
        if( key[ KEY_UP ] ) { postac.klatka = 4; postac.y -= 2; }
        if( key[ KEY_DOWN ] ) { postac.klatka = 1; postac.y += 2; }
        speed--;
       
        frame++;
        if( frame > 60 ) frame = 0; }
    // Czyszczenie bufora
    clear_to_color( bufor, makecol( 250, 0, 250 ) );
    // Sterowanie animacją
    if( frame < 20 ) { postac.kierunek = 0; }
    if( frame >= 20 && frame < 40 ) { postac.kierunek = 1; }
    if( frame >= 40 && frame < 60 ) { postac.kierunek = 2; }
}

//Wyświetlanie postaci.
masked_blit( bufor, postacb, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 ); //najpierw postać na bufor

blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); //potem bufor na ekran

} //zamykasz jeszcze pętlę while żeby animacja trwała do naciśnięcia ESC


remove_int( increment_speed );
destroy_bitmap( bufor );
destroy_bitmap( postacb );
destroy_bitmap( tlo );
//itd...[/code]

//EDIT: powinieneś jeszcze czyścić bufor ale do tego już sobie dojdziesz  czytając uważnie kurs Allegro
P-17370
dyzzioo
Temat założony przez niniejszego użytkownika
» 2010-05-30 19:04:09
Zerknij na to teraz. Powinno działac? Bufor mam czyscic jeszcze po wyświetleniu postaci na ekran, na koncu drugiej petli while?

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

class Cpostac
{
public:
    int x, y;
    short int kierunek, klatka;
};

// Zmienna naszej klasy.
Cpostac postac;
//Timer.
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );


//Początek głównej funkcji.
int main()
{
    allegro_init();
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) );
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    set_palette( default_palette );
    clear_to_color( screen, makecol( 0, 0, 60 ) );
    textout_ex( screen, font, "Projekt 'Gra I'", 600, 0, makecol( 0, 250, 250 ), - 1 );
   
    //Deklaracja obrazów.
    BITMAP * postacb = NULL;
    BITMAP * bufor = NULL;
    BITMAP * tlo = NULL;
   
    // Tworzenie bufora
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Za malo pamieci potrzebnej do stworzenia bufora ekranu !\n" );
        allegro_exit();
        return 0;
    }
   
    //Ładowanie tła.
    tlo = load_bmp( "mapka.bmp", default_palette );
   
    blit( tlo, screen, 0, 0, 0, 0, 800, 600 );
    //Ładowanie grafiki.
    postacb = load_bmp( "postac.bmp", default_palette );
   
    //Ustawianie początkowej pozycji postaci.
    int frame = 0;
    postac.x = 100,
    postac.y = 100,
    postac.klatka = 0,
    postac.kierunek = 0;
   
    while( !key[ KEY_ESC ] );
   
    {
        while( speed > 0 )
        {
            postac.klatka = 0;
            if( key[ KEY_LEFT ] ) { postac.klatka = 2; postac.x -= 2; }
            if( key[ KEY_RIGHT ] ) { postac.klatka = 3; postac.x += 2; }
            if( key[ KEY_UP ] ) { postac.klatka = 4; postac.y -= 2; }
            if( key[ KEY_DOWN ] ) { postac.klatka = 1; postac.y += 2; }
            speed--;
           
            frame++;
            if( frame > 60 ) frame = 0; }
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 250, 0, 250 ) );
        // Sterowanie animacją
        if( frame < 20 ) { postac.kierunek = 0; }
        if( frame >= 20 && frame < 40 ) { postac.kierunek = 1; }
        if( frame >= 40 && frame < 60 ) { postac.kierunek = 2; }
       
        //Wyświetlanie postaci.
        masked_blit( postacb, bufor, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
       
    }
   
    remove_int( increment_speed );
    destroy_bitmap( bufor );
    destroy_bitmap( postacb );
    destroy_bitmap( tlo );
   
   
   
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-17372
Patzick
» 2010-05-30 19:14:40
dałeś jeszcze raz to samo. Nie leń się tylko przeanalizuj kod który Ci dałem, a o czyszczeniu bufora poczytaj w kursie. Nikt Ci nie będzie dawał ciągle gotowych rozwiązań, do tego trzeba wysiłku.
P-17373
ison
» 2010-05-30 19:26:05
Patzick, pewnie nie zauwazyles ale w twoim kodzie tez jest błąd ;)
w tym miejscu:
C/C++
masked_blit( bufor, postacb, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 60, 60 ); //najpierw postać na bufor

zapomniałeś o kolejności argumentów, najpierw podaje się bitmape jaką chcesz rysować a potem na jakiej bitmapie.
A u ciebie rysowany jest bufor na bitmapie postaci
P-17374
Patzick
» 2010-05-30 19:39:20
masz rację :) to dlatego, że nie kompilowałem tego i byłem przekonany, że on kolejność argumentów ma dobrą, skupiłem się na bardziej rzucających się w oczy błędach xD
P-17375
dyzzioo
Temat założony przez niniejszego użytkownika
» 2010-05-30 19:46:13
Okej, robie tak że po kazdym przebiegu głownej pętli while czyszcze bufor, a po tym zapisuje obraz postaci na buforze, a bufor wyswietlam na screen i wciaż nie ma sladu po postaci. Wiec albo wczytuje mi ją pod tlo albo w ogóle jej nie wczytuje lub jescze jest gdzies poza planszą. Ma ktos jakis pomysł? patrząc na ten kod powyżej ?
P-17376
dyzzioo
Temat założony przez niniejszego użytkownika
» 2010-05-31 15:59:05
Czy jest możliwość, że przy takim kodzie program nie wchodzi w pętlę? Bo gdy nacisnąłem esc zobaczyłem(doslownie ulamek sekundy), że pogram wyświetlił tlo i postac. Zastanawiam się więc dlaczego nie wyświetla jej wciąć skoro blit z buforem jest wpisany w pętle while( key[KEY_ESC]) a po kazdym przejsciu bufor jest czyszczony.

C/C++
//Ustawianie początkowej pozycji postaci.
postac.x = 100;
postac.y = 100;
int frame = 0;
postac.klatka = 0;
postac.kierunek = 0;
while( !key[ KEY_ESC ] );

{
   
    while( speed > 0 )
    {
       
        postac.klatka = 0;
        if( key[ KEY_LEFT ] ) { postac.kierunek = 2; postac.x -= 2; } else
        if( key[ KEY_RIGHT ] ) { postac.kierunek = 3; postac.x += 2; } else
        if( key[ KEY_UP ] ) { postac.kierunek = 4; postac.y -= 2; } else
        if( key[ KEY_DOWN ] ) { postac.kierunek = 1; postac.y += 2; }
        speed--;
       
        frame++;
        if( frame > 60 ) frame = 0;
       
    }
    // Czyszczenie bufora.
    clear_to_color( bufor, makecol( 255, 255, 255 ) );
    // Sterowanie animacją
    if( frame < 20 ) { postac.klatka = 0; }
    if( frame >= 20 && frame < 40 ) { postac.klatka = 1; }
    if( frame >= 40 && frame < 60 ) { postac.klatka = 2; }
   
    //Wyświetlanie grafiki.
    masked_blit( tlo, bufor_tlo, 0, 0, 0, 0, 800, 600 );
    masked_blit( postacb, bufor, postac.kierunek * 60, postac.klatka * 60, postac.x, postac.y, 100, 100 );
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    blit( bufor_tlo, screen, 0, 0, 0, 0, 800, 600 );
   
   
}
P-17388
« 1 » 2
  Strona 1 z 2 Następna strona