游戏制作过程中,如何解决闪屏问题???

lizhigang34 2008-03-13 11:13:28
我想做个简单的游戏,游戏中的人物都是加载位图,在更新游戏画面时,我用的办法是重绘屏幕..
先把位图加载到内存,然后用BitBlt函数,把内存中的位图覆盖显示器上的位图..
但每次都会出现闪屏..

另外,有没有什么办法,让画图过程都在内存中,比如,现有一张前景和背景图片,用什么办法在内存中,让这两张图片重叠,再一次性的显示到屏幕,我想这样应该就不会出现闪屏了..请高手指教,谢谢!!
...全文
235 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
scq2099yt 2008-03-16
  • 打赏
  • 举报
回复
双缓存
lizhigang34 2008-03-14
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
guanghong 2008-03-14
  • 打赏
  • 举报
回复
CDC memDC1,memDC2;
memDC1.CreateCompatibleDC(pDC);
memDC2.CreateCompatibleDC(pDC);
CBitmap bitmap1,bitmap2,*oldmap;
CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(pDC,600,800);


memDC1.SelectObject(&memBitmap);
memDC1.FillSolidRect(0,0,600,800,RGB(255,255,255));

bitmap1.LoadBitmap(IDB_BITMAP1);
memDC2.SelectObject(&bitmap1);
memDC1.BitBlt(0,0,600,800,&memDC2,0,0,SRCCOPY);

bitmap2.LoadBitmap(IDB_BITMAP2);
memDC2.SelectObject(&bitmap2);
memDC1.BitBlt(0,0,600,800,&memDC2,0,0,SRCCOPY);
pDC->BitBlt(0,0,600,800,&memDC1,0,0,SRCCOPY);
你的情况应该是背景被覆盖掉了,略写了一段,你试试吧,背景图片要比前面的大才行啊!
「已注销」 2008-03-14
  • 打赏
  • 举报
回复
使用双缓冲是个问题. 但LZ注意WM_ERASEBKGND消息的处理:默认的情况下WM_ERASEBKGND的处理是用白色刷新背景----这自然会造成屏幕的闪烁.设置WM_ERASEBKGND返回0(切记为0),及可解决问题
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
lizhigang34 2008-03-13
  • 打赏
  • 举报
回复
这是我在OnDraw(CDC *pDC)中写的代码

CDC MemDC; //首先定义个显示设备对象
CBitmap MemBitmap; //定义个位图对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //将位图选入内存显示设备
CBitmap BitmapBackground,BitmapSprite; //定义两个位图,背景位图和精灵位图
BitmapBackground.LoadBitmap(IDB_BACKGROUND); //加载背景位图
BitmapSprite.LoadBitmap(IDB_SPRITE); //加载精灵位图
MemDC.SelectObject(&BitmapBackground); //将背景位图选入内存显示设备
MemDC.SelectObject(&BitmapSprite); //将精灵位图选入内存显示设备
pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY); //将内存中的位图拷贝到屏幕上进行显示

结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
guanghong 2008-03-13
  • 打赏
  • 举报
回复
思路你不都知道了么,就是双缓存
新建一个memdc,先在memdc上画好了

在pDC->bitblt(0,0,width,height,&memdc,0,0,SRCCOPY);
显示出来就行了

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧