Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Re: Анимированная графика в Delphi

Привет ALL!
Я хочу сделать анимацию в Delphi, но не подключая каких=ни будь посторонних
библиотек (OpenGl,DirectX и пр.). И столкнулся с такой проблемой: при
прорисовки изображения постоянно "мерцает", даже если использовать
прорисовку через буфер.
Может кто-нибудь знает как избавится от "мерцания"?
А может кто подскажет библиотеки для прорисовке анимации на форме?

P/S Просто хочется сделать простенькую игрушку, не прибегая к возможностям
"мощных" библиотек. Даже подумывал сделать её попросту на TP,

Номер выпуска : 3494
Возраст листа : 336 (дней)
Количество подписчиков : 464
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/216936
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписать: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Mon, 23 Aug 2004 18:00:09 +0400 (#216936)

 

Ответы:

Приветствую Малышев,

Monday, August 23, 2004, 6:00:09 PM, you wrote:

В Visual C++ эта проблема решалась перехватом сообщения OnEraseBkgnd.
По умолчанию этот обработчик вызывает обработчик базового класса,
который заливает окно/форму белым цветом каждый раз при перерисовке,
откуда и мерцание. Просто убираем вызов обработчика родительского
окна (т.е. делаем функцию пустой) и все. На WinAPI аналогично -
перехват WM_ERASEBKGND и ничего не делаем (т.е. не вызываем
DefWindowProc). Эта проблемы на уровне винды, так что и в Дельфи
должно сработать.

Ответить   Mon, 23 Aug 2004 22:10:41 +0400 (#217095)

 

Здравствуйте !

Немного уточню (относитеьлно работы этого механизма) :
Когда приходит WM_ERASEBKGND, в wParam передается дескриптор
контекста устройства, для которого можно, например, выбрать
некоторую кисть (которой и будет закрашиваться фон окна),
установить другие аттрибуты. В том же MFC для класса обычного
окна (CWnd) сообщение отдается на обработку самой винде
через CWnd::Default, а затем ::CallWindowProc.
Винда выбирает в контекст сплошную кисть цвета COLOR_WINDOW
(получить такую кисть можно через ::GetSysColorBrush(COLOR_WINDOW);

В принципе - да, но более правильный подход - выбрать
в переданный контекст пустую кисть, полученную так :
::GetStockObject(NULL_BRUSH);

Ну, да думаю, в делфи тоже достаточно перехватить WM_ERASEBKGND.

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru

Номер выпуска : 3506
Возраст листа : 337 (дней)
Количество подписчиков : 466
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/217654
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписать: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Tue, 24 Aug 2004 18:07:12 +0400 (#217654)

 

Привет Малышев,

Monday, August 23, 2004, 8:00:09 PM, писали вы:

Делал такое путем выведения окон анимации на окно... Правда в
чистеньком WinApi... Мерцания не было...
Правда выводил avi-шки...
Примерно так:

/* Вывод анимации идет после строчки if(Ani)
AnimHead=new AnimNode и т. п. - это список окон анимации,
с помощью которого вся анимация удаляется при перерисовке окна */

int CField::SetMoveCell (int CellX,int CellY,HDC hdc, int &TurnCount, int
&TurnPlayer)
{
int t;
HWND hAnim;
LPCSTR Anim;
HBITMAP Bmp;

//Если ход возможен
if (Cells[CellX][CellY].SetStatus(TurnFlag+1))
{
//Если ходил первый игрок
if (TurnFlag)
{
//Ставим анимацию первого игрока
Anim=AnFirst;
//и картинку первого игрока
Bmp=ImFirst;
}
else
{
//Иначе, ставим анимацию 2-го игрока
Anim=AnSecond;
//и картинку второго игрока
Bmp=ImSecond;
}
//меняем флаг хода
TurnFlag=!TurnFlag;
//устанавливаем ячейке соответствующую картинку
Cells[CellX][CellY].SetBitmap(Bmp);
//если включена анимация
if (Ani)
{
//создаем окно с анимацией
hAnim=Animate_Create(hWindow,ID_ANIMATE,WS_CHILD,hInst);
if (hAnim==NULL)
{
GetError("Animate_Create");
Ani=0;
Draw(hdc);
}
//добавляем окно в список окон с анимацией
if (AnimHead==NULL)
{
AnimHead=new AnimNode;
AnimHead->hAnim=hAnim;
AnimHead->Next=NULL;
AnimLast=AnimHead;
}
else
{
AnimLast->Next=new AnimNode;
AnimLast->Next->hAnim=hAnim;
AnimLast->Next->Next=NULL;
AnimLast=AnimLast->Next;
}
//запускаем анимацию
if (Ani)
{
SetWindowPos(hAnim,0,CellX*Width+X,CellY*Height+Y,
Width,Height,SWP_NOZORDER);
Animate_Open(hAnim, Anim);
ShowWindow(hAnim, SW_SHOW);
Animate_Play(hAnim, 0, -1, 1);
}
}
else
{
Draw(hdc);
}
//определяем, выиграл ли кто-либо после этого хода
t=GameStatus(CellX,CellY);
if (t)
{
return t;
}
if (!TurnFlag) Round++;
TurnCount=Round;
TurnPlayer=TurnFlag+1;
return t;
}
//если ход не сделан, возвращаем -1
return -1;
}

Ответить   Tue, 24 Aug 2004 12:09:04 +0600 (#217333)

 

Hello, Малышев.

Под win32 - никак. Только с помощью OpenGL или Direct3D. Кстати, при
использовании их игруха заберёт меньше ресурсов, чем при
использовании 2d API, т.к. часть вычислений возмёт на себя видюха.

Еси лень, пиши на Pascal/QBasic/Borland C

Ответить   "B." Mon, 23 Aug 2004 23:04:18 +0400 (#217370)

 

Здравствуйте, gluck.

Вы писали 23 августа 2004 г., 21:00:09:

Для прорисовки используй InvalidateRect(handle, Nil, False);
Handle - дискриптор компонента для которого вызывается перерисовка.

Ответить   Tue, 24 Aug 2004 17:01:36 +0700 (#217570)

 

Привет Малышев,

Создаешь в памяти BitMap и там рисуешь, то бишь делаешь

А

Это просто: используешь API-функцию BitBlt.
BOOL BitBlt(
HDC hdcDest, // handle to destination device context
int nXDest, // x-coordinate of destination rectangle's upper-left
corner
int nYDest, // y-coordinate of destination rectangle's upper-left
corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source device context
int nXSrc, // x-coordinate of source rectangle's upper-left corner
int nYSrc, // y-coordinate of source rectangle's upper-left corner
DWORD dwRop // raster operation code
);
Только в качечтве источника указываешь Canvas формы или панели, только
не TImage (появляется куча проблем).

Афоризм напоследок: Опыт отнюдь не мешает нам повторить прежнюю глупость, но
мешает получить от нее прежнее удовольствие!!!
24 августа 2004 г. 21:58:02

Просто студент
Eugene mailto:rav***@o*****.ru

Номер выпуска : 3511
Возраст листа : 338 (дней)
Количество подписчиков : 466
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/218228
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписать: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Tue, 24 Aug 2004 22:05:21 +0400 (#218228)

 

Здоровеньки булы, Малышев Георгий!

23 августа 2004 г., понедельник, 19:00:09 (GMT+05:00), пришел ко мне
почтальон Почкин и всучил письмо с пометкой "Анимированная графика в Delphi",
в котором сообщалось следующее:

Может просто DoubleBuffered := true; поможет?

Ответить   "Томилов Александр" Thu, 26 Aug 2004 03:46:49 +0500 (#222563)

 

Привет Томилов,

Thursday, August 26, 2004, 2:46:49 AM, вы мне писали:

Поставь в самом конце!!!

ControlStyle:=ControlStyle+[csOpaque]; //Убирает эффект мерцания!!!

Работает 150% :о)

С уважением -= alexsashkin =-

mailto: alexsashkin20***@u*****.net
ISQ: 338899399

Номер выпуска : 3525
Возраст листа : 353 (дней)
Количество подписчиков : 471
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/226222
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.prog.prog
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписать: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Thu, 9 Sep 2004 00:17:15 +0400 (#226222)