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

[Allegro, C++] Problem z podwójnym buforowaniem

Ostatnio zmodyfikowano 2010-06-28 15:58
Autor Wiadomość
Scot
Temat założony przez niniejszego użytkownika
[Allegro, C++] Problem z podwójnym buforowaniem
» 2010-06-28 14:27:00
A wiec tak jak w temacie mam problem z podwójnym  buforowaniem . Problem mój polega na tym , iz w wiekszosci kursow pokazane jest jak uzyc go w takiej postaci : bufor + postać . Mi zależny na tym , by dowiedzieć się jak użyć go w takim przypadku by postać była wyświetlana na bitmapie stworzonej przez mnie , nie na buforze . Tak wygląda mój aktualny kod :
C/C++
#include <allegro.h>
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT, 1200, 800, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    BITMAP * tor = NULL; //mapa
    BITMAP * bufor = NULL; //bufor
    BITMAP * car = NULL; //pojazd do sterowania
   
    tor = load_bmp( "tor.bmp", default_palette );
    if( !tor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę zaladowac tor.bmp !" );
        allegro_exit();
        return 0;
    }
   
    bufor = create_bitmap( 1100, 750 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    car = load_bmp( "car.bmp", default_palette );
    if( !car )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować car.bmp !" );
        allegro_exit();
        return 0;
    }
   
    int car_x = 100, car_y = 100;
   
    while( !key[ KEY_ESC ] )
    {
        if( key[ KEY_LEFT ] ) car_x--;
       
        if( key[ KEY_RIGHT ] ) car_x++;
       
        if( key[ KEY_UP ] ) car_y--;
       
        if( key[ KEY_DOWN ] ) car_y++;
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        //rest(10);
        masked_blit( car, bufor, 0, 0, car_x, car_y, car->w, car->h );
        blit( bufor, screen, 0, 0, 0, 0, 1200, 800 );
       
    }
   
    destroy_bitmap( car );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
Prosiłbym by ktoś go poprawił , ponieważ na tym przykładzie prawdopodobnie najłatwiej było by mi go zrozumieć.
P-18387
ison
» 2010-06-28 15:25:04
mógłbyś jasniej przedstawić swój problem? Twój kod działa bez zarzutów...
wszystko co chcesz aby było wyświetlane najpierw rysujesz na buforze a potem cały bufor wywalasz na ekran

i jeszcze taka mała sugestia
zamiast
C/C++
set_color_depth( 16 );
zrób
C/C++
int depth = desktop_color_depth();
if( depth == 0 ) depth = 32;

set_color_depth( depth );
ponieważ w twoim programie na viście jest wyłączane Aero podczas działania programu
P-18389
Scot
Temat założony przez niniejszego użytkownika
» 2010-06-28 15:29:46
Chodzi mi o to , ze car.bmp wyświetlany jest na buforze , a chce by byl wyswietlany na tor.bmp i nie umiem tego pogodzić , albo nie widzę car.bmp , albo się rozmazuje , albo mryga itp .
P-18390
ison
» 2010-06-28 15:39:30
to najpierw rysujesz tor na buforze i potem car na buforze
C/C++
masked_blit( tor, bufor, 0, 0, 0, 0, tor->w, tor->h );
masked_blit( car, bufor, 0, 0, car_x, car_y, car->w, car->h );
blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );

zmień też
C/C++
set_gfx_mode( GFX_AUTODETECT, 1200, 800, 0, 0 );
na
C/C++
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1200, 800, 0, 0 );
bo w twoim programie na Viście przed odpaleniem gry okienko troche miga


jeśli już się zabierasz za robienie gry to polecam przeczytać jakiś tutorial o timerach. Są bardzo ważne, dzięki nim na każdym komputerze twoja gra będzie chodziła z taką samą szybkością.
P-18392
Scot
Temat założony przez niniejszego użytkownika
» 2010-06-28 15:58:33
Wielkie dzięki , właśnie o to mi chodziło . Co do windowed to zapomniałem  zmienić bo wcześniej tak miałem . Jeszcze raz wielkie dzieki . Temat do zamknięcia .
P-18394
« 1 »
  Strona 1 z 1