Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2008, 13:19   #1
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
Сообщение Особенности программированя движущихся объектов

Судя по мертвой тишине, царящей в этой ветке, начался учебный год
или погода придавила.В принципе тишину можно толковать двояко -
всем все предельно ясно ( в чем я сильно сомневаюсь) либо же -
Надоело ! Все бестолково и ни черта не понятно.
Ладно, теперь по теме.Вы уже заметили, что во всех своих примерах, где
есть движение, я применяю примитивный метод - стер изображение, нарисовал в другом месте, что, естественно приводит к заметному мерцанию объекта при движении.Как простыми методами избавиться от
этого эффекта следущая небольшая статья (см. вложение).
Вложения
Тип файла: rar Устранение эффекта мигания.rar (63.1 Кб, 100 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 04.09.2008, 19:41   #2
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Такой вопрос. Давно ещё меня заинтересовал. А обязательно ли писать всё в ручную, если можно написать DoubleBuffered := true...и ещё одно, вообще DoubleBuffered более сильнее нагружает весь процесс?
Манжосов Денис :) вне форума Ответить с цитированием
Старый 05.09.2008, 23:56   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 06.09.2008, 09:54   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Применение промежуточного буфера эквивалентно двойной буферизации.Но здесь вы, как в приведенных выше примерах программно
применяете метод только в нужных местах, скажем при выводе изображения.Применение же DoubleBuffered приводит к повышенной
нагрузке на аппаратную часть. как правильно заметил ув. mutabor
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 10.09.2008, 17:26   #5
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию Еще немного о движении объектов

Я тут написал три универсальных модуля для разных случаев движения см. вложенный
Moduls.rar:
Buf_FP - перемещение простого объекта по фону, размером не больше экрана;
Buf_FSPic – перемещение спрайта по фону, размером не больше экрана;
Вuf_FSFon – перемещение спрайта по фону, размером больше экрана (когда применяется скроллинг).
Устройство каждого модуля подробно расписано в коментах кодов внутри.
Применение модуля показано на примере мультика Multic.rar. Cам файл модуля помещается в папке с проектом и подключается в разделе uses файла Unit 1.
Вложения
Тип файла: rar Moduls.rar (3.7 Кб, 46 просмотров)
Тип файла: rar Multic.rar (474.7 Кб, 51 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 13.02.2009, 23:33   #6
Костян Пират
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 103
По умолчанию

Цитата:
Сообщение от DeKot Посмотреть сообщение
Ладно, теперь по теме.Вы уже заметили, что во всех своих примерах, где есть движение, я применяю примитивный метод - стер изображение, нарисовал в другом месте, что, естественно приводит к заметному мерцанию объекта при движении.Как простыми методами избавиться от этого эффекта следущая небольшая статья (см. вложение).
для просмотра результата тупо скопировал код, запустил и... ничего не проиходит! пустая форма, картинки не грузятся...
Костян Пират вне форума Ответить с цитированием
Старый 14.02.2009, 11:22   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

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

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 14.02.2009, 16:40   #8
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Все мерцания только от неверного метода вывода графики на экран. В большинстве своем, берут Image и только в него и рисуют, т.е. в реальном времени мы успеваем замечать как происходит последовательность наложения объектов зарисовывания/обновления фона. После такого безобразия все жалобы по поводу "правильной работы" кода и "непонятно от куда возьмись мерцания" звучат просто глупо. ВСЕГДА нужно рисовать на скрытом буфере/холсте, который никогда на прямую не может быть отображен на экран, пока идет построение кадра, а только в самом конце, когда кадр готов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.02.2009, 18:01   #9
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

ТЫ имеешь ввиду ImageBox (это в борланд С++)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 14.02.2009, 19:10   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

В Delphi два основных объекта, отображающих графику, это Image (Additional) и PaintBox (System), ...есть еще API BitBlt(). Последний предпочтительнее, может выводить буфер TBitmap, в котором подготавливается кадр, куда-угодно через контекст, хоть в кнопку, притом с теми же возможностями обрезки по размеру и началу отображения, плюс методы ключевых цветов или копирования.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Много объектов. Манжосов Денис :) Общие вопросы 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