Конференция "Игры" » Организация OnClick у спарйта? [Delphi, Windows]
 
  • CMOS © (29.06.07 21:51) [0]
    Как отследить клик мышкой по спрату?
    Можно "поместить" спрайт в прямоугольник и отслеживать диапазон координат (x1<=X<=x2, y1<=Y<=y2).
    В этом случае если я кликну мимо, я могу все равно попасть.

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

    Как можно сделать еще?
  • grouzd)ev © (29.06.07 22:37) [1]
    а где происходит действие? как реализованы спрайты?

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

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • ElectriC © (30.06.07 01:17) [2]
    Спрайт в пространстве или на плоскости?
  • @!!ex © (30.06.07 09:17) [3]
    Самый элементарный и дебильный способ:
    Рисуешь спрайти, получаешь проекциии координат четырех координат на экран, по этим 4 точкам получаешь четыре уравнения прямых, подставляешь в каждое из уравнений координаты мыши, если все четыре постановки дали отрицательное число - мыша на спрайте. Понятно что уравнение надо строить по часовой стрелке, если против часовой, то мышь внутри, если числа положительные.
  • CMOS © (30.06.07 22:28) [4]
    Спрайты реализованы через Asphyre (2D). Отрисовка AsphyreCanvas.Draw

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

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

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

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

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

    Фишка с уравнениями прямых - получится четырехоугольник. Не пойдет также как и прямоугольник
  • @!!ex © (30.06.07 22:31) [5]
    > [4] CMOS ©   (30.06.07 22:28)

    Бред вы городите. Как спрайт не врщай, всегда получается четырехугольник. Ферштейн?
  • @!!ex © (30.06.07 22:33) [6]
    Другое дело, если имеется ввиду, клик не по спрайту, а по видимой части спрайта. Это не одно и тоже.
    Тогда самое простое - ALPHA_TEST+STENCIL_TEST.
  • Домик (30.06.07 22:52) [7]
    Еще как варинат: можно задавать для спрайта зону чувствительности многоугольником, а потом лишь проверять вхождение точки (курсора мыши) в этот многоугольник.
  • Li-ion (01.07.07 02:45) [8]
    Самый простой вариант. Создаешь для курсора спрайт 1х1 пиксель. Прикрепляешь чтоб он был постоянно в конце курсора. Потом в процедуре OnClick формы пишешь if <спрайт курсора> collisioned <со спрайтом который надо отследить> then <все шо тебе надо>
  • Li-ion (01.07.07 02:45) [9]
    И ненадо никаких уравнений прямых и т.д.
  • @!!ex © (01.07.07 09:00) [10]
    > [9] Li-ion   (01.07.07 02:45)

    гы-гы-гы. ЛОЛ. Ништяк.
    А как вы будете считать коллизию без уравнений прямых и плосковстей, когда вся CD написана на этих уравнениях??? :))))
  • Li-ion (02.07.07 00:39) [11]
    to @!!ex

    автор же написал что использует Asphyre, там уже за него CD все написано. Он же не спрашивал как написать CD,  а просто как отследить клик мыши по спрайту.
  • @!!ex © (02.07.07 22:27) [12]
    >
    > [11] Li-ion   (02.07.07 00:39)

    Ок.
    ПРавда если яего правильно понял, это все равно не его вариант.
    Хотя автор исчез и ни на что не реагирует, можно предположить, что проблему решил.
  • Li-ion (03.07.07 09:42) [13]
    хоть бы написал тут как он решил )
  • CMOS © (03.07.07 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 (04.07.07 01:20) [15]
    Оригинально. Но мне кажется мой пример был намного проще и быстрее.
  • CMOS © (04.07.07 07:09) [16]
    А как организована коллизия в Asphyre? Проверка пересечения прямоугольников
  • Li-ion (04.07.07 14:18) [17]
    там есть 3 вида:
    1) Прямоугольник
    2) круг
    3) Полигон, но его не реализовали :)
  • CMOS © (04.07.07 16:40) [18]
    >Проблема сводится к повороту и масштабированию 1-битовой картинки и СОХРАНЕНИЮ ее в Bitmap.
 
Конференция "Игры" » Организация OnClick у спарйта? [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]