Innym sposobem wykrywania kursora nad nieregularnym kształtem jest korzystanie z obrazu maski, o takich samych wymiarach jak właściwa grafika. Maska może być bitmapą monochromatyczną lub dowolną inną. Potrzebne są dwa kolory - jeden dla tła i jeden dla obiektu. Aby móc oznajmić, że kursor znajduje się nad obiektem, musi się znajdować w prostokątnym obszarze grafiki, a po drugie, musi się znajdować nad pikselem, którego kolor w masce odpowiada kolorowi obiektu.
Przykład - poniżej właściwa grafika z jakimś obiektem:
I jej obraz maski:
Ładujemy oba obrazy do pamięci, rysujemy ten właściwy. Podczas przesuwania kursorem sprawdzamy, czy ten znajduje się nad prostokątnym obszarem grafiki. Jeśli znajduje się to obliczamy relatywne współrzędne kursora (względem lewego górnego rogu grafiki) i sprawdzamy, czy pod tymi koordynatami w grafice maski znajduje się (w tym przypadku) czarny kolor. Jeśli tak - kursor znajduje się nad obiektem i np. zmieniamy kursor na łapkę. Samo sprawdzenie czy kursor znajduje się nad obiektem to właściwie jeden warunek.
Maską nie musi być obraz - równie dobrze może nią być dwuwymiarowa macierz wartości logicznych, generowana w locie. Dzięki temu można zaoszczędzić sporo pamięci, a umiejętne posługiwanie się operacjami boolowskimi i przesunięciami bitowymi pozwoli na jeszcze większą kompresję takiej maski (jeden bit maski - jeden piksel grafiki).
Taki sposób ma wiele zalet:
- możliwa obsługa dowolnych obiektów (kształtów, map itd., przede wszystkim mocno nieregularnych, np. poszarpanych jak powyższa),
- łatwość wykonania - maskę można szybko przygotować w dowolnym lepszym programie graficznym lub wygenerować w locie,
- łatwość przygotowania kodu do wykrywania momentu najechania kursorem na właściwy obiekt,
- wielowarstowość - maska może zawierać wiele informacji, nie tylko dwie (tło/obiekt),
- duży uniwersalizm.
Niestety ma też wady:
- większe zużycie pamięci,
- generowanie maski w locie:
- oznacza większą złożoność czasową,
- może nie być najprostsze w implementacji,
- nie nadaje się do dużych grafik, ew. konieczne wysokie optymalizacje.
Ale coś za coś.