Привет Малышев,
Monday, August 23, 2004, 8:00:09 PM, писали вы:
МГ> Привет ALL!
МГ> Я хочу сделать анимацию в Delphi, но не подключая каких=ни будь посторонних
МГ> библиотек (OpenGl,DirectX и пр.). И столкнулся с такой проблемой: при
МГ> прорисовки изображения постоянно "мерцает", даже если использовать
МГ> прорисовку через буфер.
МГ> Может кто-нибудь знает как избавится от "мерцания"?
МГ> А может кто подскажет библиотеки для прорисовке анимации на форме?
МГ> P/S Просто хочется сделать простенькую игрушку, не прибегая к возможностям
МГ> "мощных" библиотек. Даже подумывал сделать её попросту на TP,
Делал такое путем выведения окон анимации на окно... Правда в
чистеньком 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;
}