Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.08;
Скачать: CL | DM;

Вниз

Организация OnClick у спарйта?   Найти похожие ветки 

 
CMOS ©   (2007-06-29 21:51) [0]

Как отследить клик мышкой по спрату?
Можно "поместить" спрайт в прямоугольник и отслеживать диапазон координат (x1<=X<=x2, y1<=Y<=y2).
В этом случае если я кликну мимо, я могу все равно попасть.

Можно взять массив с размером экрана (800х600, например). Занулить его. Далее запоминать точки, принадлежащие спрайту в этот массив (Если есть цвет в этой точке то заполняем номером). Спрайты не будут менять координаты. Но при удалении спрайта массив нужно заполнять снова. Да и при динамическом создании спрайта тоже массив заполнять.

Как можно сделать еще?


 
grouzd)ev ©   (2007-06-29 22:37) [1]

а где происходит действие? как реализованы спрайты?

если мышь попала в прямоугольник (хотя можно и не), посмотреть точку в которую попали на спрайте - прозрачная или нет

---
... we are walking on a thin line and you better avoid the risk ...


 
ElectriC ©   (2007-06-30 01:17) [2]

Спрайт в пространстве или на плоскости?


 
@!!ex ©   (2007-06-30 09:17) [3]

Самый элементарный и дебильный способ:
Рисуешь спрайти, получаешь проекциии координат четырех координат на экран, по этим 4 точкам получаешь четыре уравнения прямых, подставляешь в каждое из уравнений координаты мыши, если все четыре постановки дали отрицательное число - мыша на спрайте. Понятно что уравнение надо строить по часовой стрелке, если против часовой, то мышь внутри, если числа положительные.


 
CMOS ©   (2007-06-30 22:28) [4]

Спрайты реализованы через Asphyre (2D). Отрисовка AsphyreCanvas.Draw

Прямоуголник сразу не пойдет! Допустим, такой спрайт:

ОООООО
      ООО
Х     ООО

O - сам спрайт. Х - клик мышки в этом месте.

Получилось, я не попал на спрайт, но ОнКлик сработает, т.к. я попал в прямоугольник.

Проверить точку тоже не пойдет. Если на экране проверять - под спрайтами подложен фон. Если на спрайте проверять - спрайты рисуются под случайным углом и отображенными. А точку можно проверить только у AsphyreImage, которая хранится в исходном состоянии. А отображается повернутой.

Фишка с уравнениями прямых - получится четырехоугольник. Не пойдет также как и прямоугольник


 
@!!ex ©   (2007-06-30 22:31) [5]

> [4] CMOS ©   (30.06.07 22:28)

Бред вы городите. Как спрайт не врщай, всегда получается четырехугольник. Ферштейн?


 
@!!ex ©   (2007-06-30 22:33) [6]

Другое дело, если имеется ввиду, клик не по спрайту, а по видимой части спрайта. Это не одно и тоже.
Тогда самое простое - ALPHA_TEST+STENCIL_TEST.


 
Домик   (2007-06-30 22:52) [7]

Еще как варинат: можно задавать для спрайта зону чувствительности многоугольником, а потом лишь проверять вхождение точки (курсора мыши) в этот многоугольник.


 
Li-ion   (2007-07-01 02:45) [8]

Самый простой вариант. Создаешь для курсора спрайт 1х1 пиксель. Прикрепляешь чтоб он был постоянно в конце курсора. Потом в процедуре OnClick формы пишешь if <спрайт курсора> collisioned <со спрайтом который надо отследить> then <все шо тебе надо>


 
Li-ion   (2007-07-01 02:45) [9]

И ненадо никаких уравнений прямых и т.д.


 
@!!ex ©   (2007-07-01 09:00) [10]

> [9] Li-ion   (01.07.07 02:45)

гы-гы-гы. ЛОЛ. Ништяк.
А как вы будете считать коллизию без уравнений прямых и плосковстей, когда вся CD написана на этих уравнениях??? :))))


 
Li-ion   (2007-07-02 00:39) [11]

to @!!ex

автор же написал что использует Asphyre, там уже за него CD все написано. Он же не спрашивал как написать CD,  а просто как отследить клик мыши по спрайту.


 
@!!ex ©   (2007-07-02 22:27) [12]

>
> [11] Li-ion   (02.07.07 00:39)

Ок.
ПРавда если яего правильно понял, это все равно не его вариант.
Хотя автор исчез и ни на что не реагирует, можно предположить, что проблему решил.


 
Li-ion   (2007-07-03 09:42) [13]

хоть бы написал тут как он решил )


 
CMOS ©   (2007-07-03 21:27) [14]

Проблему почти решил.

Создал 1-битовую копию спрайта, далее...

Слышали что-нибудь про модули FastDIB, FastFX, FastDraw и т.д.?
Процедура
procedure Rotozoom(Src,Dst:TFastDIB;Angle:Double;Zoom:Integer;Smooth:Boolean);
Берет первую картинку, поворачивает, масштабирует, и присваевает полученное другой картинке.

Дальше проверяю цвет 1 или 0. Все это не на поверхности, а на самой картинке. Картинка увеличена и повернута.
Только один минус у этой процедуры она не работает с монохромными картинками (не предусмотренно). Не хочется держать в памяти еще одну 32-битную картинку, да еще увеличенную.

Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.


 
Li-ion   (2007-07-04 01:20) [15]

Оригинально. Но мне кажется мой пример был намного проще и быстрее.


 
CMOS ©   (2007-07-04 07:09) [16]

А как организована коллизия в Asphyre? Проверка пересечения прямоугольников


 
Li-ion   (2007-07-04 14:18) [17]

там есть 3 вида:
1) Прямоугольник
2) круг
3) Полигон, но его не реализовали :)


 
CMOS ©   (2007-07-04 16:40) [18]

>Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.



Страницы: 1 вся ветка

Текущий архив: 2009.11.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
9-1183543161
Dib@zol
2007-07-04 13:59
2009.11.08
Скринсейверы


1-1222628088
Castello
2008-09-28 22:54
2009.11.08
Общение между приложениями


2-1253215998
Артем
2009-09-17 23:33
2009.11.08
tabsheet


2-1253681952
Ksandr
2009-09-23 08:59
2009.11.08
Access без ODBC... как...???


15-1252604993
TUser
2009-09-10 21:49
2009.11.08
Самый главный вопрос Вселенной, жизни и всего такого ...