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

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

Анимация [D6, WinXP]


Страницы:   1 2 3

Аним ©   (2004-07-27 19:09:00) 

Вопрос общего плана:
Как можно сделать анимацию наиболее плавно?
Чтоб при передвижении объекта не было мельканий (при стирании и рисовки заново)?
Но с учетом того, что задний фон динамически меняется..

нужно любое:
алгоритм на словах.. основные функции.. в общем, любые мысли..
кто то ведь с этим уже сталкивался..

спасибо.


parovoZZ   (2004-07-30 11:29:00) [1]

Короче, надо на форму изображение переносить за один приём. Тогда мерцаний не будет.


MegaVolt   (2004-07-30 09:58:00) [2]

Вот решил выложить пример отрисовки с мерцание и без. Простенько рисую на канве. Без мерцания исспользую двойную буферизацию :) http://webfile.ru/34572


Аним   (2004-07-30 00:16:00) [3]


>  независимо как, независимо на чём, без буфера мелькания
> были, есть и будут. Вывод: надо делать буфер.

Какой же буфер при работе с регионами?! Если ты о двойном, то он, понятно, нужен за тем, чтоб не было мельканий при анимации с конкретным фоном..
А тут.. ведь регион подрезает окно по границам изображения, после чего все что нужно - тупо наложить поверх свою графику..
Фон автоматически отпадает - о нем заботиться не надо..

а в буфер что загонять?! ну еси тока эту "однослойную" графику..
или не так?

p.s. код joffa не смотрел, но там точно ети регионы. Да он и всегда поверх остальных окон..
В овцах  - точно нет (не регионы).
там как раз работа с дискриптором рабочего стола (это сложнее)..
берут кусочек его перед тем как себя нарисовать.. и используют как фон..
обновляют только когда поверх их окна проходит чужое или при получении фокуса своего..
при этом обновлении жуткое мерцание: себя скрывают, берут фон и опять себя рисуют..

это я так.. )

при работе с регионами - ну ессественно мельканий (заметных) нет..
без всяких там буферов.. ))


Огромное Кулясищще   (2004-07-29 23:34:00) [4]

> Докладываю: в ходе испытаний было выяснено, что действительно,  независимо как, независимо на чём, без буфера мелькания были, есть и будут. Вывод: надо делать буфер.

Либо выкладывай код, либо читай начало поста Огромное Кулясищще ©   (29.07.04 20:47) [33].


parovoZZ   (2004-07-29 23:17:00) [5]


> но разве в паузу между изменением региона окна и выводом
> на измененный регион графики не произойдет мелькания?..
>
> Или просто при изменении региона...
> Тут никакая буферизация не поможет...

Если отлавливать необходимые сообщения, то мельканий можно избежать, что я и сделал. Но я ненавижу VCL. Причин много, но не об этом речь.

> Огромное Кулясищще ©   (29.07.04 22:32) [35]
> >А подробнее можно? Сейчас попробую. О результатах доложу.
>
> Меняй, например, в OnPaint.

Уже сказал.


> Аним   (29.07.04 20:44) [32]
> Блиин.. а что, DelphiX тока для пятых делфей?
> Выше нет негде?

Есть, у меня для 6-ой стоит на 7-ой делфе. Но не советую использовать из-за примитивности. Я себе поставил только лишь чтобы сорцы чужие изучать.


> о результатах доложу


Докладываю: в ходе испытаний было выяснено, что действительно,  независимо как, независимо на чём, без буфера мелькания были, есть и будут. Вывод: надо делать буфер.

Но я не понял: почему же Joffa мелькает, а мой скринмэйт нет? Хотя оба они используют регионы.

//Своего скринмэйта пока не выкладываю, доделываю интерфейс и физику надо подправить.


Аним   (2004-07-29 22:52:00) [6]

Я менял по таймеру и использовал компонент TDIBFormShaper...
(для получения HRGN с исключением нужного цвета из битмапа)

мельканий не заметил...
p.s.
я предпологал, что когда у формы изменится регион, а новая картинка еще не наложится, этот момент будет заметен..
ан, нет.. ))
хотя может от загрузки ЦП это немного зависит..


Огромное Кулясищще   (2004-07-29 22:32:00) [7]

> А подробнее можно? Сейчас попробую. О результатах доложу.

Меняй, например, в OnPaint.


parovoZZ   (2004-07-29 22:05:00) [8]

> Если менять реагион тогда, когда надо - никакие мелькания не возникнут.

А подробнее можно? Сейчас попробую. О результатах доложу.


Огромное Кулясищще   (2004-07-29 20:47:00) [9]

Косячки курить - это плохо. Так вот, по делу. Если менять реагион тогда, когда надо - никакие мелькания не возникнут.


Аним   (2004-07-29 20:44:00) [10]

Блиин.. а что, DelphiX тока для пятых делфей?
Выше нет негде?


Аним   (2004-07-29 20:36:00) [11]


> могу лишь только посоветовать освоить DirectDraw;

все впереди.. я тока начал разбираться.. )

> но всё-таки я не понял, что ты хочешь делать: рисовать в
> своём окне или рисовать в чужом?

сам заметил, что сильно отклонился от сабжа.. в конце уже говорил о чужом окне..

> BitBlt с флагом SRCCOPY просто накладывает новое изображение
> на старое, причём старое безвозвратно теряется.

Да, с этим все давно ясно..

> И что значит информация устарела? Это то, что при воспроизведении
> из буфера она будет накладываться на обновившуюся картинку?
> Так кто мешает запомнить картинку в этом же самом буфере
> и потом воспроизвести на экран?

Сейчас, разберусь со всем.. что-то уже сам запутался.. ))
А все потому, что уже не решаю конкретную задачу, а просто пробую.. т.с. изучаю..


Аним   (2004-07-29 19:24:00) [12]


> Через регионы.

Сомнительно..
Это самое простое, что можно подумать при попытке реализовать простейший screenmate..
но разве в паузу между изменением региона окна и выводом на измененный регион графики не произойдет мелькания?..
Или просто при изменении региона...
Тут никакая буферизация не поможет...
У них мелькания нет..
Правда и вывод не плавный.. с большим шагом..
Хотя надо попробовать..


> http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm
> листай вниз до antialiasing

спасибо, смотрим..


parovoZZ   (2004-07-29 19:11:00) [13]

Извините, сижу в опере, потому на все вопросы ответы в кучу...
По скринмэйту: обрезаю форму регионом (можно сделать хоть дырку в окне).
Скринмэйт лежит где-то здесь, игрушка называется Joffa http://delphigfx.mastak.ru/game3.htm
to Аним:
могу лишь только посоветовать освоить DirectDraw; но всё-таки я не понял, что ты хочешь делать: рисовать в своём окне или рисовать в чужом? И что значит информация устарела? Это то, что при воспроизведении из буфера она будет накладываться на обновившуюся картинку? Так кто мешает запомнить картинку в этом же самом буфере и потом воспроизвести на экран?
BitBlt с флагом SRCCOPY просто накладывает новое изображение на старое, причём старое безвозвратно теряется.


Огромное Кулясищще   (2004-07-29 18:43:00) [14]

> Требую.. ))

http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm
листай вниз до antialiasing

> Ды?

Именно.


Огромное Кулясищще   (2004-07-29 18:41:00) [15]

> Но как тогда решена проблема с фоном?.. на котором его выводят.. он же постоянно меняется..

Через регионы.


Аним   (2004-07-29 18:12:00) [16]

Кстати говоря,
http://www.delphimaster.ru/cgi-bin/forum.pl/forum.pl/?id=1090418922&n=7


> Огромное Кулясищще ©   (21.07.04 20:29) [8]
> > Как можно рисовать быстрее GDI?
>
> www.g32.org  см. Graphic32
>
> > с помощью чего рисовать-то
>
> Вывод пикселя через прямоугольник 1х1. Попиксельно рисуй
> примитивы.


Ды?


Аним   (2004-07-29 18:08:00) [17]


> Ссылок кинуть могу, но только по требованию.

Требую.. ))


Аним   (2004-07-29 18:06:00) [18]

что-то я ударился в screenmates.. ))

Вот:
http://grin.bip.ru/Progr/scmpoo.zip

барашек, кот. бегает по экрану..
качественный китайский screenmate..

его действительно рисуют в отдельним своем окне, а не выводят на чужой dc..
Но как тогда решена проблема с фоном?.. на котором его выводят.. он же постоянно меняется..

не важно двойной буферизацией или как-то еще..
с выводом спрайта вопросов нет..
а откуда они берут фон для использования пусть той же двойной буферизации на дискрипторе своего окна?.. это же фон экрана..


Огромное Кулясищще   (2004-07-29 18:00:00) [19]

> antialiase? и что это? а ссылок, что почитать по этому нет?..
хоть какие-нить keywords чтоб в хелпе глянуть..


Ссылок кинуть могу, но только по требованию. Можешь попробовать поработать с Graphic32 - там это всё реализовано, собственно, оттуда и пример.


Аним   (2004-07-29 17:52:00) [20]


> А кто мешает перед перерисовкой формы скинуть её содержимое
> в какой-нибудь буфер?

Так я на ее dc свою графику вывожу. Да, могу ее запомнить перед своим выводом, но после мне как затереть то, что я поверх нарисовал?! Поставить поверх то, что запомнил?! не-е.. это - устарелая инфа.. ее тоже надо обновить..
Ну и что же, не вызывать же инвалидейт?..
Вот и будет:

> без буфера VCL делает то, что ты ему задаёшь делать, а именно:
> нарисовать на окне, обновить окно, нарисовать на окне, обновить окно.



> А скринмэйт (экранный помошник) это всего-лишь окно, которое
> движется по экрану, а перерисовка окон, находящегося под
> ним, это забота вынды. По крайней мере, я ей так приказал
> делать.

Т.е. что, ты на канве своего окна рисуешь етого помошника, да?
спрайтового персоонажа..
Но оформлено это у тя как? в своем окне ты убрал границы и заместо фона окна ставишь тот фон, что под ним?! или как..
Как ты добился эффекта прозрачности, того, как-будто спрайт движется по столу?..


> Ты мне скажи, что ты делаешь, чтобы у тебя мерцало. Не допираю
> никак.

)) Так нет, мерцания нет (при статичном backgroung-е)..
Теперь остались только лишь скачки с пикселя на следующий....
Как я понял, от этого можно избывиться своеобразной размытостью границ спрайта на 1px?..

> Нужно применить сглаживание к пикселю (antialiase). Грубо
> говоря, чем больше площадь лежит на одном из четырёх занимаемых пикселей, тем непрозрачней цвет.

antialiase? и что это? а ссылок, что почитать по этому нет?..
хоть какие-нить keywords чтоб в хелпе глянуть..


> На этом сайте лежит скринмэйт

Интересно, где же.. кладовка почему-то закрыта..
В каком разделе?..


Страницы:   1 2 3

Наверх

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