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

[C++][Allegro5 5.2.0] Problem przy najeżdżaniu myszką na dany bitmap

Ostatnio zmodyfikowano 2016-06-26 01:00
Autor Wiadomość
00Andre
Temat założony przez niniejszego użytkownika
[C++][Allegro5 5.2.0] Problem przy najeżdżaniu myszką na dany bitmap
» 2016-05-30 00:50:25
Witam serdecznie

Opisze ten problem po kolei:

 Sprawdzanie pozycji myszki czy jest na polu bitmap'em to działa mi.

 tylko problem jest w przypadku, gdy nasz bitmap jest np. zakryty połowie przez drugiego bitmapa

 i trzeba sprawdzić gdzie nie jest zakryty i wtedy zwrócić prawdę

 (Tutaj obrazek umieszczam)
 
problem
problem
 
 Teraz tutaj opisze moje rozwiązanie, które ma problemy

 Oto rozwiązanie:

  Każdy bitmap ma swoją kopie która jest wypełniona danym kolorem
  aby potem identyfikować bitmap za pomocą koloru.

  Te wszystkie kopie bitmap'ów rysujemy na specjalnym bitmap'ie, a
  oryginalne rysujemy normalnie w oknie.

  Potem w pętli przy zdarzeniu myszki ALLEGRO_EVENT_MOUSE_AXES
  w funkcji odpowiedzialnej za najeżdżanie myszką na bitmap'a jest
  sprawdzenie pozycja kursora czy jest na polu bitmap'a i potem
  , aby się upewnić czy dany punkt nie jest zakryty przez inny
  bitmap to sprawdzamy punkt przy użyciu funkcji al_get_pixel(bitmap, x, y)
  pobierającego pixel z specjalnego bitmapa
który zawiera narysowane wszystkie kopie
  bitmap'ów w odpowiednim kolorze.
  Jeśli kolor będzie się zgadzał to zwracamy true.

  Pomysł bardzo dobry, tylko przy częstym najeżdżaniu myszką na ten
  bitmap to po chwili robią się lagi i program nie raz na chwile
  zacina się i dopiero po chwili odzyskuje sprawność.

  Nawet blokowanie danego rejonu bitmapa i potem pobierając i od blokując go
  też nie dawało efektów których oczekuje.

  Nawet na początku projektu ustawiłem nową flagę dla nowych bitmap'ów
  ALLEGRO_NO_PRESERVE_TEXTURE, która wyłącza o dbanie tekstury bitmapa.

  Też to nie pomaga i po prostu skończyły mi się pomysły jak to zrealizować.

 Może macie jakieś rozwiązanie mojego pomysły, albo swój jakiś pomysł jak wy to rozwiązujecie takie problemy.

 Pozdrawiam.

P-148709
maly
» 2016-05-30 12:47:15
Miej listę wskażników bitmap posortowanych od najbliższej do najdalszej i iterując od najbliższej sprawdzaj czy pozycja myszy jest w.
P-148720
00Andre
Temat założony przez niniejszego użytkownika
» 2016-05-31 06:55:10
Może twój pomysł by zadziałał, ale w pętli co chwile trzeba było by zaktualizować listę pozycji bitmap'ów resztę.

A co jak bitmap który jest nad bitmap'em nie jest cały wypełniony i ma regiony gdzie jest przezroczyste ? trzeba będzie znowu korzystać z al_get_pixel(...) co znowu zamuli projekt. 

Fajnie było tak zoptymalizować funkcję pobierająca piksele, aby była jeszcze szybciejsza, bo innego rozwiązania nie widzę, aby potem sprawdzić czy kursor jest na przezroczystym punkcie.
P-148762
00Andre
Temat założony przez niniejszego użytkownika
» 2016-06-01 18:48:24
Czy ktoś ma jakiś pomysł jak to zrobić ? albo jak przyśpieszyć /zmienić funkcję pobierająca piksel z bitmap'a ?
P-148785
Gibas11
» 2016-06-01 19:21:47
To pomocnicza bitmapa zamula program, rozwiązanie @maly jest dobre a al_get_pixel wystarczająco szybkie.
P-148786
00Andre
Temat założony przez niniejszego użytkownika
» 2016-06-02 23:54:02
Przy wykrywaniu bitmapa udało mi się. Zainspirowałem się pomysłem @mały (Dzięki za pomysł)
Usunąłem pomocny bitmap w ogóle. Teraz pobieranie piksela jest szybkie.

Ale przy poruszaniu się bitmapa i najeżdżaniu jednocześnie, to są małe zacięcia.
(przy najeżdżaniu na bitmap rysuje się inny bitmap)

kod blokujący bitmap'a w funkcji najeżdżaniu myszki:
C/C++
// Blokuje pojedynczy piksel na bitmapie
ALLEGRO_LOCKED_REGION * locked = al_lock_bitmap_region( bitmap, lx, ly, lw, lh, al_get_bitmap_format( bitmap ), ALLEGRO_LOCK_READWRITE );
ALLEGRO_COLOR pxg = al_get_pixel( bitmap, abs( mx - x ), abs( my - y ) );
al_unlock_bitmap( bitmap );
P-148825
00Andre
Temat założony przez niniejszego użytkownika
» 2016-06-26 01:00:05
Powracam po czasie, ponieważ próbowałem rozwiązać dalej problem, ale coś mi nie wychodzi.

Tak jak napisałem wcześniej, teraz mam listę bitmap'ów najbliższych i sprawdzam.

Teraz tylko dalej jest problem przy funkcji najeżdżającej na bitmap

Jeśli bitmap jest np. duży i ma parę fragmentów z alpha
i gdy chcemy np. aby funkcja najeżdżająca na bitmap zwróciła prawdę tylko gdy kursor jest na fragmencie alpha bitmapa.
I to wykonywałem po przez pobierjąca pixel z bitmap'a (wcześniej blokując, a potem po pobraniu od blokując). Wszystko jest wykonywane w ALLEGRO_EVENT_MOUSE_AXES i są zacięcia. (bez tego sprawdzania wszystko normalnie chodzi)
P-149457
« 1 »
  Strona 1 z 1