Попадание курсором в текстуру - пример на hge

Данный пример показывает как точно определить попал ли курсор мыши в текстуру или нет с учетом полностью прозрачных частей.

Код функции разбит на шаги:
1) Определяем попали или нет курсором в ограничивающий прямоугольник
2) Если попали, то лочим из текстуры 1 пиксель над которым курсор мыши и извлекаем цвет пикселя
3) Затем анлочим текстуру
4) Проверяем удалось ли поймать пиксель
5) Если удалось и альфа у него больше 0, значит мы попали в текстуру

А код до безобразия прост, передаем в функцию ссылку ограничевающего прямоугольника и текстуру полученую методом HTEXTURE GetTexture() класса Sprite

bool mTestPoint(hgeRect *rect, HTEXTURE tex)
{
	if(rect->TestPoint(mx,my))
	{
		DWORD* col_ = hge->Texture_Lock(tex, true, int(mx-rect->x1 - 1), int(my-rect->y1 - 1), 1, 1); 
		
		int alpha = col_? GETA(col_[0]): 0; 
  
                hge->Texture_Unlock(tex); 
  
                if (alpha > 0) return true; else return false;	
	}
	return false;
}

Код рабочий на 100% проверено мной в своей рпг))
П,С, пример не работает, если спрайт имеет угол поворота отличный от 0

Идем дальше, скажем нам надо чтобы все правильно работало если мы используем анимацию или область текстуры размером не во всю текстуру. Тогда вместо текстуры надо передать указатель на спрайт и скорректировать результаты.

bool mTestPoint(hgeRect *rect, hgeSprite *spr)
{
	if(rect->TestPoint(mx+cx,my+cy))
	{
		float tx,ty,w,h; 
		spr->GetTextureRect(&tx,&ty,&w,&h);// получаем параметры  как текстура натянута  на спрайт

		DWORD* col_ = hge->Texture_Lock(spr->GetTexture(), true, int(mx-rect->x1 + tx - 1), int(my-rect->y1 + ty - 1), 1, 1); // добавили смешение  в текстуре tx,ty
		
		int alpha = col_? GETA(col_[0]): 0; 
  
                hge->Texture_Unlock(tex); 
  
                if (alpha > 0) return true; else return false;
	}
	return false;
}

Собственно вот и все изменения.