-
Как отследить клик мышкой по спрату?
Можно "поместить" спрайт в прямоугольник и отслеживать диапазон координат (x1<=X<=x2, y1<=Y<=y2).
В этом случае если я кликну мимо, я могу все равно попасть.
Можно взять массив с размером экрана (800х600, например). Занулить его. Далее запоминать точки, принадлежащие спрайту в этот массив (Если есть цвет в этой точке то заполняем номером). Спрайты не будут менять координаты. Но при удалении спрайта массив нужно заполнять снова. Да и при динамическом создании спрайта тоже массив заполнять.
Как можно сделать еще?
-
а где происходит действие? как реализованы спрайты?
если мышь попала в прямоугольник (хотя можно и не), посмотреть точку в которую попали на спрайте - прозрачная или нет
---
... we are walking on a thin line and you better avoid the risk ...
-
Спрайт в пространстве или на плоскости?
-
Самый элементарный и дебильный способ:
Рисуешь спрайти, получаешь проекциии координат четырех координат на экран, по этим 4 точкам получаешь четыре уравнения прямых, подставляешь в каждое из уравнений координаты мыши, если все четыре постановки дали отрицательное число - мыша на спрайте. Понятно что уравнение надо строить по часовой стрелке, если против часовой, то мышь внутри, если числа положительные.
-
Спрайты реализованы через Asphyre (2D). Отрисовка AsphyreCanvas.Draw
Прямоуголник сразу не пойдет! Допустим, такой спрайт:
ОООООО
ООО
Х ООО
O - сам спрайт. Х - клик мышки в этом месте.
Получилось, я не попал на спрайт, но ОнКлик сработает, т.к. я попал в прямоугольник.
Проверить точку тоже не пойдет. Если на экране проверять - под спрайтами подложен фон. Если на спрайте проверять - спрайты рисуются под случайным углом и отображенными. А точку можно проверить только у AsphyreImage, которая хранится в исходном состоянии. А отображается повернутой.
Фишка с уравнениями прямых - получится четырехоугольник. Не пойдет также как и прямоугольник
-
> [4] CMOS © (30.06.07 22:28)
Бред вы городите. Как спрайт не врщай, всегда получается четырехугольник. Ферштейн?
-
Другое дело, если имеется ввиду, клик не по спрайту, а по видимой части спрайта. Это не одно и тоже.
Тогда самое простое - ALPHA_TEST+STENCIL_TEST.
-
Еще как варинат: можно задавать для спрайта зону чувствительности многоугольником, а потом лишь проверять вхождение точки (курсора мыши) в этот многоугольник.
-
Самый простой вариант. Создаешь для курсора спрайт 1х1 пиксель. Прикрепляешь чтоб он был постоянно в конце курсора. Потом в процедуре OnClick формы пишешь if <спрайт курсора> collisioned <со спрайтом который надо отследить> then <все шо тебе надо>
-
И ненадо никаких уравнений прямых и т.д.
-
> [9] Li-ion (01.07.07 02:45)
гы-гы-гы. ЛОЛ. Ништяк.
А как вы будете считать коллизию без уравнений прямых и плосковстей, когда вся CD написана на этих уравнениях??? :))))
-
to @!!ex
автор же написал что использует Asphyre, там уже за него CD все написано. Он же не спрашивал как написать CD, а просто как отследить клик мыши по спрайту.
-
>
> [11] Li-ion (02.07.07 00:39)
Ок.
ПРавда если яего правильно понял, это все равно не его вариант.
Хотя автор исчез и ни на что не реагирует, можно предположить, что проблему решил.
-
хоть бы написал тут как он решил )
-
Проблему почти решил.
Создал 1-битовую копию спрайта, далее...
Слышали что-нибудь про модули FastDIB, FastFX, FastDraw и т.д.?
Процедура
procedure Rotozoom(Src,Dst:TFastDIB;Angle:Double;Zoom:Integer;Smooth:Boolean);
Берет первую картинку, поворачивает, масштабирует, и присваевает полученное другой картинке.
Дальше проверяю цвет 1 или 0. Все это не на поверхности, а на самой картинке. Картинка увеличена и повернута.
Только один минус у этой процедуры она не работает с монохромными картинками (не предусмотренно). Не хочется держать в памяти еще одну 32-битную картинку, да еще увеличенную.
Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.
-
Оригинально. Но мне кажется мой пример был намного проще и быстрее.
-
А как организована коллизия в Asphyre? Проверка пересечения прямоугольников
-
там есть 3 вида:
1) Прямоугольник
2) круг
3) Полигон, но его не реализовали :)
-
>Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.