Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с алгоритмом.


SliderCrash ©   (2003-12-13 20:54:00) 

Привет!
Никак не могу придумать (точнее понять, как алгоритмически ?сделать) такую фишку.
Вообщем, есть поле TImage. Хочу сделать так, в тот момент, когда курсор мыши проходит над этим объектом заменять его на свой тайл (TBitmap). Ну типа чтобы видеть тайл, который буду накладывать на даннцю картннку. Вот не могу понять - как это сделать алгоритмически.
Делаю сейчас так, обрабатываю OnMouseMove TImage'a.
Сохраняю сначала "подложку" оригинала в буферный битмап. Потом рисую на него новый битмап. По идее надо востанавливать потом подложку от нового - ну как обычный пример с курсором мыши.
Но но вот не знаю - когдаж этот момент наступает - чтобы востанавливать.

Сразу же в функции, которая сидит на обработчике OnMouseMove, не имеет смысла - так как картинка затрется.

вообщем, какойто кризис в мозгах наступил - помогите, pls. Сейчас у меня просто либо затирается картинка (зарисовывается мусором, либо вообще ничего не рисуется)

P.S.:
   CBuilder6
   Win2003 Server


SliderCrash   (2003-12-14 18:20:00) [1]

Понял, что ты имеешь ввиду.
Мерцания я в конкретном случае избежал, простави контролу формы DoubleBuffered в true.
По-идее в DX (Draw) - по таким принципам вроде можно работать = использовать back и front буфферы, рисовать в памяти на них и переключая выводить на экран. Правда я еще этим не занимался, но когда-то читал.


Mihey   (2003-12-14 17:40:00) [2]

> Немного не понял твою идею - почему мой подход не совсем правильный (устаревший?).

Потому, что по своим статьям он подходит только под GDI. На OpenGL и DirectX, в играх, где используется не статичное изображение, он бы не подошёл. Ты смотри по своему случаю - если даже при быстром перемещении мышки нет мерцания, то всё впорядке.

> Я перерисовываю не всю картинку, а всего лишь участок, где произшоло изменение. А по поводу XOR или OR - как их в таком случае применять? Неужели система сама будет восстанавливать "подложку" если я воспользуюсь данными типами копирования?

Вот не знаю, я не пробовал, но говорят, что да. См. вопрос про рисование на рабочем столе в этом же разделе чуть ниже.


SliderCrash   (2003-12-14 16:44:00) [3]

Спасибо за ответ!
ПРоблему вчера я решил - все заработало.
Немного не понял твою идею - почему мой подход не совсем правильный (устаревший?).

Я перерисовываю не всю картинку, а всего лишь участок, где произшоло изменение. А по поводу XOR или OR - как их в таком случае применять? Неужели система сама будет восстанавливать "подложку" если я воспользуюсь данными типами копирования?

Еще раз спасибо за ответы.


Mihey   (2003-12-14 16:04:00) [4]

> Но что восстанавливать - если начинается первая итерация: то бишь сработал 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-13 23:22:00) [5]

Конечно, я понимаю ;)
Но что восстанавливать - если начинается первая итерация: то бишь сработал OnMouseMove первый раз, я же в этот момент еще и не подготавливал бэкапную подложку - вот в чем засада - не понятно - что восстанавливать-то.


Mihey   (2003-12-13 22:45:00) [6]

Этот момент наступает в OnMouseMove дотого, как ты скопировал новую подложку. Сначала восстанавливаем так, как всё было, потом запоминаем другую картинку, потом уже рисуем.


Наверх

Титульная страница Поиск, карта сайта Написать письмо