Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
VDA
Сообщений: n/a
#1

Как сделать анимацию без мерцания? - C++

03.12.2007, 10:51. Просмотров 2639. Ответов 14
Метки нет (Все метки)

Возьмем простой пример есть рисунок bmp с нарисованным обьектом.
Я хочу чтобы он например перемещался по экрану .
Для этого загружаю рисунок в виртуальное окно.Затем с помощью
DC.BitBlt вывожу на экран.ПРичем ипользуя таймер
сдвигаю в каждое прерывание координаты вывода виртуального окна на экран.Но все мерцает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
CMainWnd::CMainWnd()
{
        CClientDC DC(this);
        m_memDC.CreateCompatibleDC(&DC);
    
     CBitmap bit;
    bit.LoadBitmap(IDB_BITMAP1);
    m_memDC.SelectObject(&bit);
       
        Create(NULL,'Animation',WS_OVERLAPPEDWINDOW,rectDefault,
        NULL,NULL);                     // 
}
Затем в таймере сдвигаю изображение
C++
1
2
3
4
5
6
7
void CMainWnd::OnTimer(UINT ID)
{
int dX=2;
int     dY=4;
    Movv.fnMove(dX,dY);
InvalidateRect(NULL);
}
и перерисовывем его
C++
1
2
3
4
5
6
void CMainWnd::OnPaint()
{ 
    
CPaintDC DC(this);
DC.BitBlt(Movv.fnGetX(),Movv.fnGetY(), Movv.fnGetX()+300,Movv.fnGetY()+300,&m_memDC,0,0,SRCCOPY);
}
Как еще это можно сделать ? чтобы рисунок перемещался плавно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2007, 10:51     Как сделать анимацию без мерцания?
Посмотрите здесь:

как сделать без ввода Массива! C++
C++ Создать еффект мерцания или чтото типа этого!
как избавится от мерцания при выводе массива C++
C++ Строковые потоки. Преобразование типов (как сделать чтобы из строки число полностью преобразовывалось в double без потери чисел)
C++ Как сделать ввод без enter?
C++ Как осуществить прорисовки и анимацию в консолевских приложениях?
C++ Как сделать ввод матрицы из файла без указания размера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Snork
Сообщений: n/a
05.12.2007, 16:24     Как сделать анимацию без мерцания? #2
Используй DirectDraw. Это конечно сложно изучать, не ЭмЭфСя, но скачай SDK и посмотри примеры. Все плавно ('Медленно и плавно, они исчезают в ванной...' :-))
VDA
Сообщений: n/a
05.12.2007, 18:02     Как сделать анимацию без мерцания? #3
Спасибо !
Я решил попробвать пописать данный кол
непосредсвенно на win 32 api
сложно конечно но многое похоже
и начинаешь понимать как все работает.
Но без mfc конечн никуда.
Но win32 более низкий уровень.
и пока более интересно
Snork
Сообщений: n/a
06.12.2007, 09:07     Как сделать анимацию без мерцания? #4
Не за что!

Я не думаю, что Win32API решит данную проблему. Как я понял, ты же пользуешься контекстами устройств, а какая разница работаешь ты напрямую с hDC или оно инкапсулировано в CDC? Все дело в том, что для того, чтобы избежать мерцания, нужна особая техника вывода (с буфером, а не просто блиттинг). Серъезно двухмерной графикой через контексты я не занимался и не скажу, можно ли там реализовать этот ход. Но точно знаю, что DirectDraw его поддерживает.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
06.12.2007, 16:17     Как сделать анимацию без мерцания? #5
MFC тут ни при чем, при такой простенькой анимации можно обойтись и MFC, принцип: создаешь, как впрочем ты и делаешь, CD для рисования на основе Bitmap, рисуешь на нем следующий кадр, потом копируешь его на существующее реальное графическое устройство, НО при вызове Invalidate, надо указывать параметр bRedraw или как там его FALSE, чтобы не происходило перед перирисовкой затирания предыдущего кадра фоном от родительского окна (оно обычно серое и вызывает то самое неприятное мерцание).

Удачи, Владимир
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
06.12.2007, 17:52     Как сделать анимацию без мерцания? #6
P.S. см. пример полезного класса http://www.codeproject.com/gdi/bufferdc.asp
VDA
Сообщений: n/a
09.12.2007, 10:45     Как сделать анимацию без мерцания? #7
Большое спасибо всем кто ответил !
VDA
Сообщений: n/a
09.12.2007, 11:08     Как сделать анимацию без мерцания? #8
Кстати заработало ( поставил InvalidateRect(NULL,FALSE)
мерцать перестало .
Только вот медленно мой битмап двигается хотя
прерывания таймера установил SetTimer(1,1,NULL)
а если dx dy (смещения в каждое прерывание таймера) поставить
большими то он скачкаобразно движется.
Попробую еще DirectDraw.

А может податься в opengl или directx ?
(я вообще хочу написать типа бильярда что нибудь
заодно и учусь сям под винды).
VDA
Сообщений: n/a
09.12.2007, 16:11     Как сделать анимацию без мерцания? #9
2Snork.
DirectDraw конечно круто но разбиратьсяяяя.....
но интересно (правда пока не понятно)
интерфейсы всякие башню сносит.
Ладно полез в msdn читать о directdraw дальше.
успехов мне.
Snork
Сообщений: n/a
09.12.2007, 18:31     Как сделать анимацию без мерцания? #10
Да, непросто. Зато какие перспективы!

Желаю удачи. Снорк.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
09.12.2007, 18:43     Как сделать анимацию без мерцания? #11
Слушай, а может прерывания у тамера надо пореже установить ну там 50-100 перерисовок в сек., чтобы уж процессор не загружать... Как я понял по прерыванию таймера у тебя перерисовывается весь экран в соответствии с текущим состоянием игрового поля, так вот таймер закидывает события в очередь сообщений слмишком часто и они все равно не укладываются в промежуток 1 мсек или сколько ты там отводишь... Может быть это причина?

Хотя конечно в любом случае для игрушек - DirectX - это однозначно!

Удачи, Владимир
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
09.12.2007, 18:46     Как сделать анимацию без мерцания? #12
P.S. DirectDraw is a part of DirectX
VDA
Сообщений: n/a
10.12.2007, 16:05     Как сделать анимацию без мерцания? #13
ДА кстати а где взять SDK и что это такое ?
в мсдне вроде есть раздел Platform SDK documentation где
про directx написано
но там по моему без примеров .А где примеры по directdraw взять ?

Дмитрий.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
10.12.2007, 16:15     Как сделать анимацию без мерцания? #14
http://msdn.microsoft.com/downloads/default.asp?url=/downloads/topic.asp?url=/msdn-files/028/001/168/topic.xml

Have fun, Vladimir
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2007, 17:58     Как сделать анимацию без мерцания?
Еще ссылки по теме:

Как сделать замену слова в строке без использования функций библиотеки string? C++
как в старом добром турбо с++ синхронизировать звук и анимацию? C++
Как сделать получение текста из консоли, без остановки программы? C++
C++ Страуструп. Сортировка трех чисел .Как сделать проще код без циклов и массивов?
Как избавиться от мерцания в gdi? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VDA
Сообщений: n/a
11.12.2007, 17:58     Как сделать анимацию без мерцания? #15
Привет !
Я все никак не могу настроить мой прект чтобы
работать с обьектом directdraw.
может кто нить кинет примерчик простой
например
вывести обычный трехмерный шар.
и опишет как все нужно настроить какие библиотеки подключить и тд.
буду очень благодарен.
да насчет SDK там 130 мегов
мне мой щеф такой трафик не простит


С уважением Дмитрий.
Yandex
Объявления
11.12.2007, 17:58     Как сделать анимацию без мерцания?
Ответ Создать тему
Опции темы

Текущее время: 09:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru