![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Организация OnClick у спарйта? [Delphi, Windows]
CMOS © (2007-06-29 21:51:00)Как отследить клик мышкой по спрату?
Можно "поместить" спрайт в прямоугольник и отслеживать диапазон координат (x1<=X<=x2, y1<=Y<=y2).
В этом случае если я кликну мимо, я могу все равно попасть.
Можно взять массив с размером экрана (800х600, например). Занулить его. Далее запоминать точки, принадлежащие спрайту в этот массив (Если есть цвет в этой точке то заполняем номером). Спрайты не будут менять координаты. Но при удалении спрайта массив нужно заполнять снова. Да и при динамическом создании спрайта тоже массив заполнять.
Как можно сделать еще?
CMOS (2007-07-04 16:40:00) [1]>Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.
Li-ion (2007-07-04 14:18:00) [2]там есть 3 вида:
1) Прямоугольник
2) круг
3) Полигон, но его не реализовали :)
CMOS (2007-07-04 07:09:00) [3]А как организована коллизия в Asphyre? Проверка пересечения прямоугольников
Li-ion (2007-07-04 01:20:00) [4]Оригинально. Но мне кажется мой пример был намного проще и быстрее.
CMOS (2007-07-03 21:27:00) [5]Проблему почти решил.
Создал 1-битовую копию спрайта, далее...
Слышали что-нибудь про модули FastDIB, FastFX, FastDraw и т.д.?
Процедура
procedure Rotozoom(Src,Dst:TFastDIB;Angle:Double;Zoom:Integer;Smooth:Boolean);
Берет первую картинку, поворачивает, масштабирует, и присваевает полученное другой картинке.
Дальше проверяю цвет 1 или 0. Все это не на поверхности, а на самой картинке. Картинка увеличена и повернута.
Только один минус у этой процедуры она не работает с монохромными картинками (не предусмотренно). Не хочется держать в памяти еще одну 32-битную картинку, да еще увеличенную.
Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.
Li-ion (2007-07-03 09:42:00) [6]хоть бы написал тут как он решил )
@!!ex (2007-07-02 22:27:00) [7]>
> [11] Li-ion (02.07.07 00:39)
Ок.
ПРавда если яего правильно понял, это все равно не его вариант.
Хотя автор исчез и ни на что не реагирует, можно предположить, что проблему решил.
Li-ion (2007-07-02 00:39:00) [8]to @!!ex
автор же написал что использует Asphyre, там уже за него CD все написано. Он же не спрашивал как написать CD, а просто как отследить клик мыши по спрайту.
@!!ex (2007-07-01 09:00:00) [9]> [9] Li-ion (01.07.07 02:45)
гы-гы-гы. ЛОЛ. Ништяк.
А как вы будете считать коллизию без уравнений прямых и плосковстей, когда вся CD написана на этих уравнениях??? :))))
Li-ion (2007-07-01 02:45:00) [10]И ненадо никаких уравнений прямых и т.д.
Li-ion (2007-07-01 02:45:00) [11]Самый простой вариант. Создаешь для курсора спрайт 1х1 пиксель. Прикрепляешь чтоб он был постоянно в конце курсора. Потом в процедуре OnClick формы пишешь if <спрайт курсора> collisioned <со спрайтом который надо отследить> then <все шо тебе надо>
Домик (2007-06-30 22:52:00) [12]Еще как варинат: можно задавать для спрайта зону чувствительности многоугольником, а потом лишь проверять вхождение точки (курсора мыши) в этот многоугольник.
@!!ex (2007-06-30 22:33:00) [13]Другое дело, если имеется ввиду, клик не по спрайту, а по видимой части спрайта. Это не одно и тоже.
Тогда самое простое - ALPHA_TEST+STENCIL_TEST.
@!!ex (2007-06-30 22:31:00) [14]> [4] CMOS © (30.06.07 22:28)
Бред вы городите. Как спрайт не врщай, всегда получается четырехугольник. Ферштейн?
CMOS (2007-06-30 22:28:00) [15]Спрайты реализованы через Asphyre (2D). Отрисовка AsphyreCanvas.Draw
Прямоуголник сразу не пойдет! Допустим, такой спрайт:
ОООООО
ООО
Х ООО
O - сам спрайт. Х - клик мышки в этом месте.
Получилось, я не попал на спрайт, но ОнКлик сработает, т.к. я попал в прямоугольник.
Проверить точку тоже не пойдет. Если на экране проверять - под спрайтами подложен фон. Если на спрайте проверять - спрайты рисуются под случайным углом и отображенными. А точку можно проверить только у AsphyreImage, которая хранится в исходном состоянии. А отображается повернутой.
Фишка с уравнениями прямых - получится четырехоугольник. Не пойдет также как и прямоугольник
@!!ex (2007-06-30 09:17:00) [16]Самый элементарный и дебильный способ:
Рисуешь спрайти, получаешь проекциии координат четырех координат на экран, по этим 4 точкам получаешь четыре уравнения прямых, подставляешь в каждое из уравнений координаты мыши, если все четыре постановки дали отрицательное число - мыша на спрайте. Понятно что уравнение надо строить по часовой стрелке, если против часовой, то мышь внутри, если числа положительные.
ElectriC (2007-06-30 01:17:00) [17]Спрайт в пространстве или на плоскости?
grouzd)ev (2007-06-29 22:37:00) [18]а где происходит действие? как реализованы спрайты?
если мышь попала в прямоугольник (хотя можно и не), посмотреть точку в которую попали на спрайте - прозрачная или нет
---
... we are walking on a thin line and you better avoid the risk ...