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

[Allegro, C++] Problem z rysowaniem myszką po ekranie

Ostatnio zmodyfikowano 2010-07-04 22:55
Autor Wiadomość
Bartaz
Temat założony przez niniejszego użytkownika
[Allegro, C++] Problem z rysowaniem myszką po ekranie
» 2010-07-04 21:47:19
Początek niniejszego tematu pod adresem: http://forum.ddt.pl/?Tid=2620
A wiec tak wszystko chodzi rysuje tylko tak jakby allegro nie nadarzala za ruchami myszki jak wolno sie rysuje to jest dobrze a jak szybko ruszy myszka to robi sie tylko pare kropek .
Daje screena.
http://yfrog.com/6fhhhhhhhhhhhhhhhhhhhhhhhlj

i kod:
C/C++
#include <allegro.h>
bool czy_zaznaczony_olowek = false;
BITMAP * bufor = NULL;
BITMAP * kartka = NULL;
BITMAP * przycisk_olowek = NULL;
BITMAP * olowek = NULL;
void draw()
{
    if( mouse_x > 7 && mouse_x < 7 + przycisk_olowek->w &&
    mouse_y > 70 && mouse_y < 70 + przycisk_olowek->h )
    {
        clear_to_color( przycisk_olowek, makecol( 3, 100, 3 ) );
       
    }
    else
    {
        clear_to_color( przycisk_olowek, makecol( 255, 0, 0 ) );
    }
    if( mouse_x > 7 && mouse_x < 7 + przycisk_olowek->w &&
    mouse_y > 70 && mouse_y < 70 + przycisk_olowek->h && mouse_b == 1 )
    {
        czy_zaznaczony_olowek = true;
        clear_to_color( przycisk_olowek, makecol( 110, 7, 30 ) );
    }
    if( czy_zaznaczony_olowek == true && mouse_b == 1 )
    {
        mouse_x = mouse_x;
        masked_blit( olowek, kartka, 0, 0, mouse_x - 100, mouse_y - 30, olowek->w, olowek->h );
    }
};
int main()
{
    allegro_init();
    install_keyboard();
    install_mouse();
    unscare_mouse();
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 700, 0, 0 );
   
    bufor = create_bitmap( 1000, 700 );
    kartka = create_bitmap( 790, 600 );
    przycisk_olowek = create_bitmap( 70, 30 );
    olowek = create_bitmap( 3, 3 );
    clear_to_color( kartka, makecol( 255, 255, 255 ) );
    clear_to_color( przycisk_olowek, makecol( 255, 0, 0 ) );
    clear_to_color( olowek, makecol( 255, 0, 0 ) );
   
    while( !key[ KEY_ESC ] )
    {
        ///*********************************************
        draw();
        ///**********************************************
        clear_to_color( bufor, makecol( 110, 110, 110 ) );
        masked_blit( kartka, bufor, 0, 0, 100, 30, kartka->w, kartka->h );
        masked_blit( przycisk_olowek, bufor, 0, 0, 7, 70, przycisk_olowek->w, przycisk_olowek->h );
        textprintf_ex( bufor, font, 15, 75, makecol( 0, 0, 0 ), - 1, "OLOWEK" );
        show_mouse( bufor );
        masked_blit( bufor, screen, 0, 0, 0, 0, 1000, 700 );
        ///**************************************************************
    }
    allegro_exit();
    return( 0 );
}
END_OF_MAIN();
P-19462
DejaVu
» 2010-07-04 21:57:29
Hm... zapewne musiałbyś się podpiąć pod kolejkę komunikatów okna Allegro i na każde OnMouseMove rysować po buforze. Generalnie sprawa do najprostszych nie należy :)
P-19468
ison
» 2010-07-04 21:58:24
wg mnie najprostsze rozwiązanie tego problemu to rysowanie linii od poprzednio zapamiętanej pozycji kursora do aktualnej

przykładowy kawałek kodu:
C/C++
int mx = mouse_x;
int my = mouse_y;
if( mouse_b == 1 ) line( bufor, ostatnie_mx, ostatnie_my, mx, my, makecol( 255, 0, 0 ) );

ostatnie_mx = mx;
ostatnie_my = my;

//edit tak przy okazji to rozśmieszyła mnie jedna linijka w twoim kodzie:
C/C++
mouse_x = mouse_x;
jest zdecydowanie niezbędna do poprawnego funkcjonowania programu :D
P-19469
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-07-04 22:19:21
Tak wiem to pozastalosci po probie naprawieniu tego opoznienia.
A ogolnie to mi tamto nie dziala...
Ale jak sie fajnie to zmodyfikuje to fajny efekt wychodzi no ale to nie na temat xD
P-19473
ison
» 2010-07-04 22:55:06
co ci znowu nie działa??

tu masz przykład z użyciem mojej metody
C/C++
#include <allegro.h>

BITMAP * bufor = NULL;

int main()
{
    allegro_init();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    bufor = create_bitmap( 800, 600 );
    install_keyboard();
    install_mouse();
   
    int ostatnie_mx = 0;
    int ostatnie_my = 0;
   
    while( !key[ KEY_ESC ] )
    {
        int mx = mouse_x;
        int my = mouse_y;
        if( mouse_b == 1 ) line( bufor, ostatnie_mx, ostatnie_my, mx, my, makecol( 255, 0, 0 ) );
       
        ostatnie_mx = mx;
        ostatnie_my = my;
        blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
        rectfill( screen, mx - 1, my - 1, mx + 1, my + 1, makecol( 0, 255, 0 ) );
    }
    allegro_exit();
    return( 0 );
}
END_OF_MAIN();

u mnie działa perfekcyjnie...
P-19475
« 1 »
  Strona 1 z 1