|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.09.2008, 13:19 | #1 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Особенности программированя движущихся объектов
Судя по мертвой тишине, царящей в этой ветке, начался учебный год
или погода придавила.В принципе тишину можно толковать двояко - всем все предельно ясно ( в чем я сильно сомневаюсь) либо же - Надоело ! Все бестолково и ни черта не понятно. Ладно, теперь по теме.Вы уже заметили, что во всех своих примерах, где есть движение, я применяю примитивный метод - стер изображение, нарисовал в другом месте, что, естественно приводит к заметному мерцанию объекта при движении.Как простыми методами избавиться от этого эффекта следущая небольшая статья (см. вложение).
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
04.09.2008, 19:41 | #2 |
Участник клуба
Регистрация: 29.01.2008
Сообщений: 1,039
|
Такой вопрос. Давно ещё меня заинтересовал. А обязательно ли писать всё в ручную, если можно написать DoubleBuffered := true...и ещё одно, вообще DoubleBuffered более сильнее нагружает весь процесс?
|
05.09.2008, 23:56 | #3 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Зависит от конкретного случая. Когда нужно а когда и не нужно. Если делать анимацию по таймеру, лучше делать через собственный буфер, результат лучше будет. Обязательно, не обязательно - тебя никто не обязует ни в чем, как хочешь так и делай.
С помощью DoubleBuffered можно убрать мерцание в прикладной программе, в разных контролах. Тут эта функция действительно полезна. Сильнее конечно нагружает, на то она и двойная буферизация.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
06.09.2008, 09:54 | #4 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Применение промежуточного буфера эквивалентно двойной буферизации.Но здесь вы, как в приведенных выше примерах программно
применяете метод только в нужных местах, скажем при выводе изображения.Применение же DoubleBuffered приводит к повышенной нагрузке на аппаратную часть. как правильно заметил ув. mutabor
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
10.09.2008, 17:26 | #5 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Еще немного о движении объектов
Я тут написал три универсальных модуля для разных случаев движения см. вложенный
Moduls.rar: Buf_FP - перемещение простого объекта по фону, размером не больше экрана; Buf_FSPic – перемещение спрайта по фону, размером не больше экрана; Вuf_FSFon – перемещение спрайта по фону, размером больше экрана (когда применяется скроллинг). Устройство каждого модуля подробно расписано в коментах кодов внутри. Применение модуля показано на примере мультика Multic.rar. Cам файл модуля помещается в папке с проектом и подключается в разделе uses файла Unit 1.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
13.02.2009, 23:33 | #6 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 103
|
Цитата:
|
|
14.02.2009, 11:22 | #7 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Хм... я не смотрел вложения, но тут у меня есть мысль. Движущийся объект находится ведь на каком-то заднем планет (фон, который, обычно, заметно больше того, что реально нужно перерисовывать при движении, и следователньо, именно из-за его прорисовки происходит мерцание (точнее его прорисовка вносит большой вклад в мерцание)), можно перед прорисовкой самого объекта сделать битовый обрз той области фона, которую займет объект, а затем при движении поверх объекта вырисовывать этот битовый образ, затем запонимать новый (тот, который под новым расположением объекта), а затем рисовать сам объект.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
14.02.2009, 16:40 | #8 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Все мерцания только от неверного метода вывода графики на экран. В большинстве своем, берут Image и только в него и рисуют, т.е. в реальном времени мы успеваем замечать как происходит последовательность наложения объектов зарисовывания/обновления фона. После такого безобразия все жалобы по поводу "правильной работы" кода и "непонятно от куда возьмись мерцания" звучат просто глупо. ВСЕГДА нужно рисовать на скрытом буфере/холсте, который никогда на прямую не может быть отображен на экран, пока идет построение кадра, а только в самом конце, когда кадр готов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
14.02.2009, 18:01 | #9 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
ТЫ имеешь ввиду ImageBox (это в борланд С++)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
14.02.2009, 19:10 | #10 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
В Delphi два основных объекта, отображающих графику, это Image (Additional) и PaintBox (System), ...есть еще API BitBlt(). Последний предпочтительнее, может выводить буфер TBitmap, в котором подготавливается кадр, куда-угодно через контекст, хоть в кнопку, притом с теми же возможностями обрезки по размеру и началу отображения, плюс методы ключевых цветов или копирования.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Много объектов. | Манжосов Денис :) | Общие вопросы Delphi | 5 | 04.09.2008 22:34 |
Прикрепление объектов | фЁдОр | Помощь студентам | 20 | 10.09.2007 10:48 |
Странные особенности функции ТДАТА | valerij | Microsoft Office Excel | 1 | 05.09.2007 07:50 |
Мерцание объектов | Chaos-Delta | Мультимедиа в Delphi | 4 | 02.07.2007 13:59 |
Конструктор объектов | Yoger | Общие вопросы Delphi | 10 | 20.04.2007 12:45 |