Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.043 c
14-1082361375
X9
2004-04-19 11:56
2004.04.11
2 вопроса по Linux


1-1082637020
killer
2004-04-22 16:30
2004.04.11
StringGrid


1-1082711773
SasaR
2004-04-23 13:16
2004.04.11
hashtable


14-1081963920
RealRascal
2004-04-14 21:32
2004.04.11
Замена блокноту


14-1079284359
YurikGl
2004-03-14 20:12
2004.04.11
Проблемы с Zip





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский