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

[Allegro] Mruganie ekranu przy zastosowaniu bufora.

Ostatnio zmodyfikowano 2010-01-09 23:51
Autor Wiadomość
maniek099
Temat założony przez niniejszego użytkownika
[Allegro] Mruganie ekranu przy zastosowaniu bufora.
» 2010-01-03 17:55:51
Witam wszystkich:) Problem polega na tym, że wszystko ładnie chodzi (identycznie wg. kursu w Code Blocks) lecz gdy generuję program nie na pełnym ekranie tylko w okienku (800x600) to program chodzi płynnie tak jak powinien lecz ikony na pulpicie mrugają (Windows XP Pro SP3). Dlaczego tak się dzieję??



PS A Gdy robię FULLSCREEN 800x600 to z kolei program się uruchamia, wczytuje dobrze bit mapy i myszkę lecz gdy ruszę chwilę myszką program się wiesza i trzeba go zamknąć przez ctrl+alt+del:( 
P-12686
malan
» 2010-01-03 18:44:27
Może masz jakiś błąd w kodzie. Jeśli możesz to go wklej :).
P-12691
maniek099
Temat założony przez niniejszego użytkownika
» 2010-01-04 22:28:37
Proszę o to kod, taki prymitywny ale pisałem wszystkie funkcje z kursu żeby sprawdzić czy chodzą:

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

inline void init()
{
    allegro_init();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
   
    install_timer();
    install_keyboard();
    install_mouse();
}

int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
}


inline void deinit()
{
    clear_keybuf();
    allegro_exit();
}

//TIMER
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );

LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
    init();
    textout_ex( screen, font, "Hello World!", 250, 100,
    makecol( 255, 255, 255 ), 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); //ilosc operacji na sekunde
   
    show_mouse( screen );
    unscare_mouse();
   
   
    // PORUSZANIE I PODWUJNY BUFOR
   
    BITMAP * samochod = NULL;
    BITMAP * samochod1 = NULL;
    BITMAP * samochod2 = NULL;
    BITMAP * samochod3 = NULL;
    BITMAP * bufor = NULL;
   
    samochod1 = load_bmp( "auto1.bmp", default_palette );
    samochod2 = load_bmp( "auto2.bmp", default_palette );
    samochod3 = load_bmp( "auto3.bmp", default_palette );
    samochod = load_bmp( "auto.bmp", default_palette );
    if( !samochod )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka!" );
        allegro_exit();
        return 0;
    }
   
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować bufora!" );
        allegro_exit();
        return 0;
    }
   
    floodfill( samochod, 1, 1, makecol( 255, 0, 255 ) );
    floodfill( samochod1, 1, 1, makecol( 255, 0, 255 ) );
    floodfill( samochod2, 1, 1, makecol( 255, 0, 255 ) );
    floodfill( samochod3, 1, 1, makecol( 255, 0, 255 ) );
   
    //PORUSZANIE
   
    int obraz_x = 40, obraz_y = 40;
    int frame = 0;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) obraz_x--;
           
            if( key[ KEY_RIGHT ] ) obraz_x++;
           
            if( key[ KEY_UP ] ) obraz_y--;
           
            if( key[ KEY_DOWN ] ) obraz_y++;
           
            speed--;
           
            frame++;
            if( frame > 80 ) frame = 0;
           
        }
       
        clear_to_color( bufor, makecol( 128, 128, 128 ) );
       
        if( frame < 20 ) { draw_sprite( bufor, samochod, obraz_x, obraz_y ); }
        else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, samochod1, obraz_x, obraz_y ); }
        else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, samochod2, obraz_x, obraz_y ); }
        else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, samochod3, obraz_x, obraz_y ); }
        else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, samochod3, obraz_x, obraz_y ); }
        myszka();
        textprintf_ex( bufor, font, 20, 20, makecol( 200, 200, 200 ), - 1, "Myszka x = %d, y = %d, klawisz = %d !", mx, my, mb );
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
       
    }
   
   
   
    readkey();
    destroy_bitmap( samochod );
    destroy_bitmap( samochod1 );
    destroy_bitmap( samochod2 );
    destroy_bitmap( samochod3 );
    destroy_bitmap( bufor );
    remove_int( increment_speed );
    deinit();
    return 0;
}
END_OF_MAIN()


Mam również inny program bez animacji, timera tylko bufor i myszka i robi się tak samo, ikony pulpitu mrugają a jak się zrobi fullscreen to się program po sekundzie zacina...
P-12727
malan
» 2010-01-05 17:48:42
Spróbuj najpierw wczytać wszystkie bitmapy, a potem to: 
C/C++
textout_ex( bufor, font, "Hello World!", 250, 100,
makecol( 255, 255, 255 ), 0 );
clear_to_color( bufor, makecol( 128, 128, 128 ) );
...wyświetlić na buforze.
P-12735
maniek099
Temat założony przez niniejszego użytkownika
» 2010-01-08 12:03:20
Nie bardzo rozumiem, bo u mnie najpierw czyszczony jest bufor, potem rysowane są na nim obrazki w zalezlnosci od wcisnietego klawisza i czasu(animacja) i potem sczytywana jest pozycja myszki, wypisana jest ona na buforze i potem cały bufor przerzucany jest na screen'a. A Ty napisałeś, żeby najpierw wszystko wyświetlić na buforze, potem go wyczyścić (clear to color) i potem wyświetlić bufor, to przecież jednolity ekran mi się wyświetli (czysty bufor). Jak zamieniłem tylko clear to color(bufor) z przed tymi wszystkimi frame, myszka() itd. na sam koniec pętli, po wyświetleniu już bufora, to już mniej mrugają ikony na pulpicie ale jednak nadal mrugają...
P-12800
malan
» 2010-01-08 14:44:49
Mi chodziło tylko o to, żebyś nic nie wyświetlał na ekranie (screen) tylko wszystko na buforze.
P-12802
maniek099
Temat założony przez niniejszego użytkownika
» 2010-01-08 21:41:13
Ale tam na screen'ie jest tylko wyświetlony tekst hello world i wyczyszczony jest ekran na siwo, ale potem i tak czyszczenie byfora i reszta funkcji jest w pętli while, wiec tak czy siak niczego to nie zmienia:/

Ma ktoś inny pomysł??
P-12821
KrQ
» 2010-01-08 23:11:31
oczywiscie że mam, blokujesz sobie pentlą while speed>0 caly program, umiesc w niej wszystko razem z wyświetlaniem i powinno ruszyć.

dlaczego wypełniasz bitmapy z obrazkami? czysci sie tylko bufor nie obrazki, chyba że chcesz by ci sie bitmapa wypełniała na podany kolor, i by powstawał piękny prostokąt.
P-12822
« 1 » 2
  Strona 1 z 2 Następna strona