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

[Allegro, C++] Wyświetlanie myszki

Ostatnio zmodyfikowano 2010-07-04 21:53
Autor Wiadomość
Bartaz
Temat założony przez niniejszego użytkownika
[Allegro, C++] Wyświetlanie myszki
» 2010-07-04 19:53:45
Witam mam taki kod i chodzi mi o to , ze myszka wyswietla sie albo wcale alo na przycisku olowek albo na bitmapie kartka i nie wiem jak zrobic zeby wyswietlalo sie wszedzie:
Probowalem zrobic tak ze zrobilem bitmape wielkosci screen'a i dalem jej kolor 255,0,255 zeby jej nie bylo widac tylko ze ja i tak bylo widac co bylo dziwne .

To ma byc program podobny do painta.
Kod:

C/C++
#include <allegro.h>
int main()
{
    allegro_init();
    install_keyboard();
    install_mouse();
    unscare_mouse();
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 700, 0, 0 );
    BITMAP * bufor = NULL;
    BITMAP * kartka = NULL;
    BITMAP * przycisk_olowek = NULL;
    bufor = create_bitmap( 1000, 700 );
    kartka = create_bitmap( 790, 600 );
    przycisk_olowek = create_bitmap( 70, 30 );
   
    clear_to_color( kartka, makecol( 255, 255, 255 ) );
    clear_to_color( przycisk_olowek, makecol( 255, 0, 0 ) );
   
   
    while( !key[ KEY_ESC ] )
    {
        show_mouse( bufor );
        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" );
        masked_blit( bufor, screen, 0, 0, 0, 0, 1000, 700 );
       
        clear_to_color( bufor, makecol( 110, 110, 110 ) );
    }
    allegro_exit();
    return( 0 );
}
END_OF_MAIN();
P-19455
DejaVu
» 2010-07-04 20:29:43
1) czyść bufor
2) rysuj wszystko na buforze
3) narysuj myszkę na buforze
4) przekopiuj bufor na ekran

/edit:
show_mouse( bufor );
Nie używaj również powyższej linijki. Na forum wielokrotnie pisałem już, że należy pobierać pozycję myszki i rysować bitmapę w jej miejscu jeżeli używa się buforowania - w przeciwnym wypadku nici z myszy.
P-19457
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-07-04 21:39:03
Problem rozwiazany wielkie dzieki ale teraz mam taki problem inny nie chce juz nowego temamu robic .
Przez ten problem kiedys porzucilem podobny projekt bo nikt nie wiedzial jak to naprawic...
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-19458
DejaVu
» 2010-07-04 21:43:44
Jeden problem = jeden temat :)

/edit:
W każdym razie problem wynika z tego, że odświeżanie gry masz np. 60 razy na sekundę, a pozycja myszki w systemie Windows jest odświeżana np. 2000 razy na sekundę. Ty rysujesz punkty gdy jest odświeżanie ekranu, a nie odświeżane myszki stąd też to działa jak działa.
P-19460
ison
» 2010-07-04 21:50:01
Niestety, aby wyeliminować ten problem musiałbyś przebudować trochę twój kod.
Najlepszym rozwiązaniem (według mnie) byłoby rysowanie linii zamiast poszczególnych kropek w miejscach gdzie aktualnie znajduje się mysz. Linia miałaby być rysowana od poprzednio zapamiętanego punktu do aktualnego. W ten sposób nawet po szybkim ruchu myszki i tak narysowana zostałaby kreska a nie same punkty. (oczywiście oprócz tego dobrze byłoby aby rysowanie tych linii i zapamiętywanie nowej pozycji kursora odbywało się w jak najszybszym tempie, nie chcemy przecież przy rysowaniu okręgu zamiast koła mieć n-kąt :))
P-19463
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-07-04 21:50:35
To jak ja mam rysowac to wtedy kiedy jest odswierzanie myszki?
P-19464
ison
» 2010-07-04 21:53:24
przykładowy kawałek kodu:
C/C++
line( bufor, poprzednie_mouse_x, poprzednie_mouse_y, mouse_x, mouse_y, makecol( 255, 0, 0 ) );
poprzednie_mouse_x = mouse_x;
poprzednie_mouse_y = mouse_y;

coś takiego załatwiłoby sprawę ;)
P-19466
DejaVu
» 2010-07-04 21:53:48
Kontynuacja tematu będzie tu: C++ allegro opozniona rysowanie
P-19467
« 1 »
  Strona 1 z 1