16 марта 2010 в 16:25
Попадание курсором в текстуру - пример на 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; }
Собственно вот и все изменения.
16 марта 2010 в 20:02
разлочивать текстуру надо только после окончания работы с ней.
Текстура останется залоченой если col_ равно 0.
Предлагаю такой вариант:
17 марта 2010 в 07:09
поправил
15 января 2014 в 01:22
beat hazard сделан на этом движке.
авторизуйтесь
или войдите через