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

[Allegro 5] problem z FULLSCREEN - miganie, dwa obrazy

Ostatnio zmodyfikowano 2014-04-12 19:52
Autor Wiadomość
marianekA
Temat założony przez niniejszego użytkownika
[Allegro 5] problem z FULLSCREEN - miganie, dwa obrazy
» 2014-04-08 17:06:29
Postanowiłem do mojej gry dołożyć opcję wyboru ekranu: okienkowy i pełny ekran
... i tu zaskoczenie - na FULLSCREEN miga i wyświetlają się dwa obrazy na przemian.
W trybie okienkowym gra działa bez zarzutu.
Użycie funkcji
al_set_new_display_flags(ALLEGRO_FULLSCREEN )
  miganie - dwa obrazy,
użycie flagi
ALLEGRO_SINGLE_BUFFER
 nie miga ale mocno spowalnia działanie.
 Jak temu zaradzić?, na co powinienem zwrócić uwagę.
A może w Allegeo jest inna możliwość skalowania okna poza FULLSCREEN?

Używam Allegro-5.0.7-mingw-4.5.2.
Podejrzewam że wina jest po mojej stronie, że źle piszę kod bo funkcję
al_flip_display()
wywołuję nie tylko w pętli głównej.
P-107907
hincu
» 2014-04-08 17:10:10
nie wiem jak dziala allegro, ale kod moglbys pokazac...
zamknij stare okno i stworz nowe zaleznie od wyboru opcji okna
P-107908
marianekA
Temat założony przez niniejszego użytkownika
» 2014-04-08 17:19:48
Kodu gry nie zamieszczę bo to ponad 2300 linii
ale zamieszczam taki przykładzik na którym próbuję rozwiązać problem
C/C++
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_ttf.h>
ALLEGRO_DISPLAY * okno = NULL; //ekran
ALLEGRO_BITMAP * kwadracik = NULL; //bitmapy
ALLEGRO_FONT * F16, * F40 = NULL; //czcioneki
ALLEGRO_MOUSE_STATE myszka; // myszka

int mx, my, mb, mz; // dla myszki
int a = 50;
int bx[ 65 ], by[ 65 ], p[ 65 ]; // wsp. i nr pol

void init()
{
    al_init(); // Allegro 5
    al_install_mouse(); // myszka
    al_init_primitives_addon(); // kreski,kwadraciki itp.
    al_init_ttf_addon(); // czcionki skalowane
    //=================================================
    //al_set_new_display_flags(ALLEGRO_WINDOWED );
    al_set_new_display_flags( ALLEGRO_FULLSCREEN );
    //al_set_new_display_flags(ALLEGRO_SINGLE_BUFFER );
    //===================================================
    okno = al_create_display( 800, 600 ); // rozmiar okna
    kwadracik = al_create_bitmap( a, a );
    al_convert_mask_to_alpha( kwadracik, al_map_rgb( 0, 0, 0 ) ); // kolor maski
    F16 = al_load_ttf_font( "arialbd.ttf", 16, 0 );
    F40 = al_load_ttf_font( "arial.ttf", 40, 0 );
}
void mouse() // myszka - przyporzadkowanie zmiennych
{
    mz = 0; // strefa na ktorej jest strzalka
    mx = myszka.x; // miejsce strzalki 'x'
    my = myszka.y; // miejsce strzalki 'y'
    mb = myszka.buttons; // klawisz myszki '0,1,2,3'
    al_get_mouse_state( & myszka ); // czy wcisniety klawisz myszki
};
void strefy() // strefy/pola aktywności wskaznika myszki
{
    // --- strefy diagramu ---
    int b = 0;
    for( int y = 0; y < 8; ++y )
    for( int x = 0; x < 8; ++x )
    {
        ++b;
        bx[ b ] = 350 + x * a; // wsp. pola x
        by[ b ] = 100 + y * a; // wsp. pola y
        //strefy pól
        if( mx > bx[ b ] + 5 && mx < bx[ b ] + a - 1 - 5 && my > by[ b ] + 5 && my < by[ b ] + a - 1 - 5 )
             mz = b;
       
    }
}
void rys_plan()
{
    strefy();
    al_set_target_bitmap( kwadracik );
    al_draw_filled_rectangle( 5, 5, a - 5, a - 5, al_map_rgb( 0, 120, 0 ) ); //tlo
    al_draw_rectangle( 5, 5, a - 5, a - 5, al_map_rgb( 0, 0, 0 ), 0 ); //ramka
   
    al_set_target_bitmap( al_get_backbuffer( okno ) );
    al_clear_to_color( al_map_rgb( 80, 120, 120 ) ); // tło okna
   
    for( int i = 1; i < 65; ++i )
    al_draw_bitmap_region( kwadracik, 0, 0, a, a, bx[ i ], by[ i ], 0 ),
    al_draw_textf( F16, al_map_rgb( 200, 200, 0 ), bx[ i ] + 17, by[ i ] + 17, 0, "%d", i ),
         al_flip_display(), al_rest( 0.05 );
   
    al_draw_textf( F16, al_map_rgb( 20, 20, 0 ), 200, 200, 1, "Numer zaznaczonego pola" );
    al_draw_textf( F16, al_map_rgb( 20, 20, 0 ), 200, 400, 1, "Myszka klik - koniec" );
}
int main()
{
    init();
    rys_plan();
    while( !myszka.buttons != 0 )
    {
        mouse();
        strefy();
        if( mz == 0 ) al_draw_filled_rectangle( 160, 220, 240, 280, al_map_rgb( 80, 120, 120 ) );
       
        if( mz > 0 )
        al_draw_filled_rectangle( 160, 220, 240, 280, al_map_rgb( 80, 120, 120 ) ), // tlo
             al_draw_textf( F40, al_map_rgb( 200, 200, 0 ), 180, 220, 0, "%d", mz ); // nr
       
        al_flip_display();
        al_rest( 0.001 );
    }
    al_destroy_display( okno );
    al_destroy_bitmap( kwadracik );
    al_destroy_font( F16 );
    al_destroy_font( F40 );
}

 
P-107909
SeaMonster131
» 2014-04-08 18:45:02
C/C++
al_flip_display();
Ogólnie tą funkcję wywołujesz tylko raz, po zakończeniu rysowania wszystkiego na ekranie.
P-107918
marianekA
Temat założony przez niniejszego użytkownika
» 2014-04-08 21:14:34
Większość operacji graficznych mam w pętlach For i tam występuje al_flip_display().
Trzeba będzie inaczej rozpisać kod by pozbyć się tych pętli. To powinno przynieść poprawę.
P-107933
marianekA
Temat założony przez niniejszego użytkownika
» 2014-04-11 20:18:43
Po wielu próbach nie udało mi się zmienić kodu tak by tylko raz występowała instrukcja
al_flip_display()
 i problem o którym wyżej nadal pozostaje.
Co ciekawe użycie
al_set_new_display_flags( ALLEGRO_FULLSCREEN_WINDOW )
nie powoduje tego problemu ale też nie skaluje zawartości okna. Pewnie dam sobie spokój z tym 'pełnym ekranem'.
P-108048
Nekronomik
» 2014-04-12 19:52:30
Po zmianie trybu przeładuj bitmapy.
P-108072
« 1 »
  Strona 1 z 1