Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> След от TImage после его перемещения, Перемещение графического объекта 
:(
    Опции темы
dimavit
Дата 3.8.2012, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.8.2012

Репутация: нет
Всего: нет



Компонент TImage создается динамически и размещается на компоненте PaintBox. При изменении положения TImage путем задания его новых координат (Left и Top) на месте начального положения остается его след. Как можно от него избавиться? Установка TImage.Visible:= False перед началом перемещения ничего не дает. Закрашивать не подходит т.к. PaintBox, являющийся фоном, имеет разные цвета и заранее не известно на каком из них (либо вообще на их границе) был размещен компонент TImage. 
PM MAIL   Вверх
Alexeis
Дата 3.8.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Да, этот TImage не особо подходит для всяких анимаций. Он скорее годиться для размещения статических картинок. Его задача хранить в себе изображение и обновлять, по мере того как вышестоящие окна его затирают. 
   Анимация делается следующим образом. Сначала рисуется очередной кадр на невидимом битмапе (если изображение само по себе не меняется, то этот шаг пропускаем), затем очищаем область в том месте где была старая картинка (часто стирают весь фон), затем восстанавливают очищенные области (или перерисовывают весь фон заново, если стирался весь фон), затем заранее подготовленный кадр из невидимого битмапа переноситься поверх отрисованного фона.

  Если будете соблюдать указанную последовательность операций, то у вас всегда получиться красивая анимация без мерцаний, лишних следов и т.д.

  Чтобы упростить себе жизнь, можно рисовать анимацию на любом оконном компоненте и перемещать его вместо TImage. Windows сама следит за правильностью отрисовки, единственное, что потребуется так это восстанавливать картинку по обработчику OnPaint . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dimavit
Дата 3.8.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.8.2012

Репутация: нет
Всего: нет



Цитата(Alexeis @ 3.8.2012,  10:29)
 затем очищаем область в том месте где была старая картинка (часто стирают весь фон), затем восстанавливают очищенные области (или перерисовывают весь фон заново,

затем восстанавливают очищенные области - можно об этом поподробнее? Перересовывать все нереально, поскольку объектов много и каждый из них движется сам по себе (и каждый оставляет след как показано на прилагаемом рисунке). <img src="http://s2.ipicture.ru/uploads/20120803/gVid871G.jpg" border="0">
PM MAIL   Вверх
dimavit
Дата 3.8.2012, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.8.2012

Репутация: нет
Всего: нет



Тут мне пришла в голову такая мысль - а может причина оставления следа это то, что родителем моего TImage является TPanel, а уже на TPanel лежит TPaintBox, на котором отрисован фон. По этому то фону и должен двигаться  TImage. Таким образом, и TImage и TPaintBox имеют общего родителя TPanel. После перемещения я и вижу на месте TImage кусочек его родителя. А вот сделать TPaintBox  родителем TImage не получается.
PM MAIL   Вверх
Alexeis
Дата 4.8.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(dimavit @  3.8.2012,  12:25 Найти цитируемый пост)
затем восстанавливают очищенные области - можно об этом поподробнее? Перересовывать все нереально, поскольку объектов много и каждый из них движется сам по себе (и каждый оставляет след как показано на прилагаемом рисунке).

  Восстанавливать нужно статический фон, который был под объектом, который сместился, ну или весь фон. Все что движется и есть анимация. Не один объект, а все сразу. Лучше если их предварительно нарисовать на невидимом битмапе, а затем битмап за одну операцию нарисовать поверх фона. В этом случае не будет мерцаний. Это называется double buffer . Можно после очистки фона рисовать сразу все на фоне. Это будет чуть быстрее, но объекты будут появляться по очереди и вызывать мерцания. Кроме того рисовать нужно строго в обработчике OnPaint, иначе можно перехлестнутся с виндой, которая может сама че нить нарисовать в момент когда мы выводим изображение. 
  Следы остаются, от того, что TImage неграмотно себя перерисовывает при движении. TImage не является окном и не может ловить все нужные сообщения об отрисовки. Он перехватывает их у нижележащего окна. Где-то там на стыке код не допилен.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.