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]
解决方案 »
- 拆分窗口鼠标十字架同步问题
- 单文档菜单被挡住
- FindWindow函数和SPY++的询问
- 关于windows mediaplay类里面属性的问题,请高手请教
- 如何在利用mfc来使用 opengl绘制
- 有谁知道ALIBABA网站上在贸易通没有启动的情况下点击“立即洽谈”后自动贸易通是怎么实现的?分不够可以加
- 怎样判断在指定路径下的文件是否存在?
- 怎样实现 单文档 多视图(双视图) 马上给分!!!!!!!!!
- [求助]哪里有这方面的更多资料?{关于获得当前进程的主窗口的类名和标题}
- IOCTL_CAM_CONT这个头文件在哪里
- VC6.0中set active project configure下只有DEBUG选项???
- 这个不难的问题我提问了2次都没人回答, 现在我再出100分问第3次, 请高手们帮我, 谢谢!
OnTimer里面画当然效果差了
你Invalidate指定需要更新的区域之后,在OnDraw里面重画指定的更新区域
m_pMap->DrawBackMap();
m_pMap->DrawMap();
//调整人物的位置;
m_Man.CheckAction(m_CurKey);
//画出人物;
m_Man.DrawMan(m_pDC);这些也许是你需要画的 都将函数里的目标DC改成一个临时的DC 然后在Timer中将临时DC画到你要显示的地方即可.
2:画好后,BitBlt到窗口DC。。
我就用这种方式做过连续的动画(动画是用鼠标拖动一个对象)窗口大小是1280X1024..一点也不闪。。
OnTimer里调用Invalidate就可以了
然后在OnDraw里面画图。
(Invalidate会自动调用OnDraw)
你的程序只要稍做修改就可以了
但是我是在好几个类里面都有Draw函数的,怎么让多个类共享对一个DC进行画的操作呢?4楼能不能说清楚点,没有明白...
需要画图的类都有一个Draw(CDC *pDC)这样的函数,调用时将指针传进去,将pDC指针定义成全局的指针是不好的做法