Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2009.11.08;
Скачать: [xml.tar.bz2];

Вниз

Организация 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
2-1253603568
rnts
2009-09-22 11:12
2009.11.08
Символ # вместо букв


2-1253798864
Fr
2009-09-24 17:27
2009.11.08
Закрытие формы


15-1252496141
KilkennyCat
2009-09-09 15:35
2009.11.08
GDI+ . Выбор рефлизации.


8-1198623882
POMbI4
2007-12-26 02:04
2009.11.08
Реализация алгоритма слежения за объектом.


1-1223062788
FlashParty
2008-10-03 23:39
2009.11.08
Delphi 2007 — INDY 10 — Работа с Gmail





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский