void CGameView::OnTimer(UINT nIDEvent)
{
if(m_IsMove)
{
//画场景;
m_pMap->DrawBackMap();
m_pMap->DrawMap(); //动画的播放;
if(m_IsDropBomb==TRUE && m_pAnima != NULL)
{
if( m_pAnima->RenderFrame(m_pDC)==TRUE )
{
m_IsDropBomb=FALSE;
delete m_pAnima;
m_pAnima=NULL;
}
}
//调整人物的位置;
m_Man.CheckAction(m_CurKey);
}
//画出人物;
m_Man.DrawMan(m_pDC);
CView::OnTimer(nIDEvent);
}
用GDI做了一个简单的游戏,但是OnTimer函数不断地刷屏让效果很差,我找了一些资料,GDI里面也可以实现双缓存,代码如下:[code=C/C++]
void CMyView::RenderView()
{
CClientDC dc(this);
CRect rc;
GetClientRect(rc);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
Bmp. CreateCompatibleBitmap (&dc,rc.Width(),rc.Height());
CBitmap *oldbmp=memdc.SelectObject(&bmp); Static int curframe=0;
m_myimglist.Draw(&memdc,curframe,Cpoint(0,0),ILD_TRANSPARENT);
curframe++;
If(curframe > m_myimglist.GetImageCount())
Curframe=0;
if(oldbmp)
memdc.SelectObject(oldbmp);
dc.BitBlt(0,0,rc.Width(),rc.Height(),&memdc,0,0,SRCCOPY);
}
因为我的代码里面有好几个画图函数,分别是不同的类的成员函数啊,我是没办法了,请高人指点一下啊,
[/code]

解决方案 »

  1.   

    怎么不用DirectX
    OnTimer里面画当然效果差了
    你Invalidate指定需要更新的区域之后,在OnDraw里面重画指定的更新区域
      

  2.   

    将你所有要画的图都画在一个临时DC中        //画场景;
            m_pMap->DrawBackMap();
            m_pMap->DrawMap();
            //调整人物的位置;
            m_Man.CheckAction(m_CurKey);
        //画出人物;
        m_Man.DrawMan(m_pDC);这些也许是你需要画的 都将函数里的目标DC改成一个临时的DC 然后在Timer中将临时DC画到你要显示的地方即可.
      

  3.   

    1:创建的内存DC不要销毁掉,频繁创建很耗时间的。要把内存DC变成白屏只要BitBlt加个WHITENESS(好象是这个)即可。BitBlt速度很快的,一般由显卡实现。
    2:画好后,BitBlt到窗口DC。。
    我就用这种方式做过连续的动画(动画是用鼠标拖动一个对象)窗口大小是1280X1024..一点也不闪。。
      

  4.   

    你既然要实现动画, 就不要在ontimer里面画图,在程序空闲的时候不断画图,一般控制40ms画一次
      

  5.   

    如果用的MFC的话,你放错地方了。
    OnTimer里调用Invalidate就可以了
    然后在OnDraw里面画图。
    (Invalidate会自动调用OnDraw)
    你的程序只要稍做修改就可以了
      

  6.   

    3楼说的将所要画的图画在一个临时DC上面,
    但是我是在好几个类里面都有Draw函数的,怎么让多个类共享对一个DC进行画的操作呢?4楼能不能说清楚点,没有明白...
      

  7.   

    >>但是我是在好几个类里面都有Draw函数的,怎么让多个类共享对一个DC进行画的操作呢?
    需要画图的类都有一个Draw(CDC *pDC)这样的函数,调用时将指针传进去,将pDC指针定义成全局的指针是不好的做法