Форум: "Media";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизПроблема с алгоритмом. Найти похожие ветки
← →
SliderCrash © (2003-12-13 20:54) [0]Привет!
Никак не могу придумать (точнее понять, как алгоритмически ?сделать) такую фишку.
Вообщем, есть поле TImage. Хочу сделать так, в тот момент, когда курсор мыши проходит над этим объектом заменять его на свой тайл (TBitmap). Ну типа чтобы видеть тайл, который буду накладывать на даннцю картннку. Вот не могу понять - как это сделать алгоритмически.
Делаю сейчас так, обрабатываю OnMouseMove TImage"a.
Сохраняю сначала "подложку" оригинала в буферный битмап. Потом рисую на него новый битмап. По идее надо востанавливать потом подложку от нового - ну как обычный пример с курсором мыши.
Но но вот не знаю - когдаж этот момент наступает - чтобы востанавливать.
Сразу же в функции, которая сидит на обработчике OnMouseMove, не имеет смысла - так как картинка затрется.
вообщем, какойто кризис в мозгах наступил - помогите, pls. Сейчас у меня просто либо затирается картинка (зарисовывается мусором, либо вообще ничего не рисуется)
P.S.:
CBuilder6
Win2003 Server
← →
Mihey © (2003-12-13 22:45) [1]Этот момент наступает в OnMouseMove до того, как ты скопировал новую подложку. Сначала восстанавливаем так, как всё было, потом запоминаем другую картинку, потом уже рисуем.
← →
SliderCrash © (2003-12-13 23:22) [2]Конечно, я понимаю ;)
Но что восстанавливать - если начинается первая итерация: то бишь сработал OnMouseMove первый раз, я же в этот момент еще и не подготавливал бэкапную подложку - вот в чем засада - не понятно - что восстанавливать-то.
← →
Mihey © (2003-12-14 16:04) [3]>Но что восстанавливать - если начинается первая итерация: то бишь сработал OnMouseMove первый раз, я же в этот момент еще и не подготавливал бэкапную подложку - вот в чем засада - не понятно - что восстанавливать-то.
В любом случае что-то должно происходить в первый раз. Ставишь какую-нибудь переменную, типа FirstEntrance: Boolean = True, а потом:
If not FirstEntrance then
begin
... Restore Image;
end;
... Copy to buffer & draw
Вообще, твоя проблема в том, что у тебя изображение похоже не весь экран обхватывает. Просто если бы ты знал, где курсор окажется, то мог бы при создании объекта Tbitmap подложки уже скопировал бы туда изображение.
Вообще, учти, что используемый тобой способ сейчас используется редко. Посмотри здесь пример:
http://delphigfx.mastak.ru/2d/001/2d_1.htm
там, где фигурка мага двигается за мышью. Там перерисовывается весь экран. Создаётся некоторое изображение в памяти, которое один раз выводится. И вот в это изображение в памяти рисуется то изображение, которое следует за курсором. Так будет легче и легче избегнуть мерцания.
Ещё правда есть мутня с or и xor, но я этим не занимаюсь.
← →
SliderCrash © (2003-12-14 16:44) [4]Спасибо за ответ!
ПРоблему вчера я решил - все заработало.
Немного не понял твою идею - почему мой подход не совсем правильный (устаревший?).
Я перерисовываю не всю картинку, а всего лишь участок, где произшоло изменение. А по поводу XOR или OR - как их в таком случае применять? Неужели система сама будет восстанавливать "подложку" если я воспользуюсь данными типами копирования?
Еще раз спасибо за ответы.
← →
Mihey © (2003-12-14 17:40) [5]>Немного не понял твою идею - почему мой подход не совсем правильный (устаревший?).
Потому, что по своим статьям он подходит только под GDI. На OpenGL и DirectX, в играх, где используется не статичное изображение, он бы не подошёл. Ты смотри по своему случаю - если даже при быстром перемещении мышки нет мерцания, то всё впорядке.
>Я перерисовываю не всю картинку, а всего лишь участок, где произшоло изменение. А по поводу XOR или OR - как их в таком случае применять? Неужели система сама будет восстанавливать "подложку" если я воспользуюсь данными типами копирования?
Вот не знаю, я не пробовал, но говорят, что да. См. вопрос про рисование на рабочем столе в этом же разделе чуть ниже.
← →
SliderCrash © (2003-12-14 18:20) [6]Понял, что ты имеешь ввиду.
Мерцания я в конкретном случае избежал, простави контролу формы DoubleBuffered в true.
По-идее в DX (Draw) - по таким принципам вроде можно работать = использовать back и front буфферы, рисовать в памяти на них и переключая выводить на экран. Правда я еще этим не занимался, но когда-то читал.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c