怎么实现游戏遮挡,且不闪烁刷屏

lure2009 2008-12-16 12:09:44
怎么实现游戏遮挡,且不闪烁刷屏。我想要3个图层,最低层是背景,中层人物,上层是从背景了里抠出来得遮挡图。

人物是会动得。请问怎么刷屏能不闪烁,实现这个功能。(下边是代码,能实现遮挡,人物能运动,就是刷屏太闪了,怎么除闪啊。)那位大侠知道下?





HBITMAP bit;
HDC MemDC;
HDC BackDC1;
HDC BackDC;
CRect rect;

int w,h,m0,m1,x,y,stx,sty,x1,y1,x0,y0,n,t,a;
CString dir;
CString cc;

int p;

BOOL loadbmp(CString cc);
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
MoveWindow(0,0,800,600);
CenterWindow();
GetWindowRect(rect);

MemDC =CreateCompatibleDC(0);
BackDC=CreateCompatibleDC(0);

// TODO: Add extra initialization here
dir="图片/";


cc=dir+"地面.BMP";
if(loadbmp(cc)==FALSE)
{AfxMessageBox(cc+"没找到!");return FALSE; }
SelectObject(BackDC,bit);
SelectObject(BackDC1,bit);
x=400,y=300;

return TRUE; // return TRUE unless you set the focus to a control



}

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}


void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL loadbmp(CString cc)
{ DeleteObject(bit);
bit=(HBITMAP)LoadImage
(AfxGetInstanceHandle(),
cc,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION
);
if(bit==NULL) return FALSE;
DIBSECTION ds;
BITMAPINFOHEADER &bm = ds.dsBmih;
GetObject(bit,sizeof(ds),&ds);
w = bm.biWidth;
h = bm.biHeight;
return TRUE;
}

void CMyDlg::OnOK()
{
// TODO: Add extra validation here



SetTimer(1,250,0);
//CDialog::OnOK();
}

void CMyDlg::OnTimer(UINT nIDEvent)
{ m1=n,m0=0;
p++;
if(p>m1) p=m0;

t++;
if(t>2) t=0;

// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
BitBlt(dc.m_hDC,0,0,800,600,BackDC,0,0,SRCCOPY);



cc.Format("%s/%03d.bmp",dir,t);
if(loadbmp(cc)==FALSE)
{AfxMessageBox(cc+"没找到!");return;}
SelectObject(MemDC,bit);



if(x1>x&&y1>y){ stx=10, sty=7;}
if(x1>x&&y1<y){stx=10,sty=-7;}
if(x1<x&&y1<y){ stx=-10, sty=-7;}
if(x1<x&&y1>y){stx=-10,sty=7;}

x+=stx,y+=sty;
TransparentBlt(dc.m_hDC,x-60,y-100,w,h,MemDC,0,0,w,h,RGB(255,255,255));




cc=dir+"地面2.BMP";
if(loadbmp(cc)==FALSE)
{AfxMessageBox(cc+"没找到!");}
SelectObject(MemDC,bit);

TransparentBlt(dc.m_hDC,0,0,w,h,MemDC,0,0,w,h,RGB(255,255,255));





CDialog::OnTimer(nIDEvent);
}

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

x1=point.x,y1=point.y;




CDialog::OnLButtonDown(nFlags, point);
}

...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabbii 2008-12-18
  • 打赏
  • 举报
回复
学习~~~
hui94781674 2008-12-18
  • 打赏
  • 举报
回复
楼主加油啊。。暴雪好公司啊。。
碼上道 2008-12-18
  • 打赏
  • 举报
回复
学习一下,顶楼主
xuedaoli 2008-12-16
  • 打赏
  • 举报
回复
先试下双缓冲绘图,看看效果如何。
应该是能改善些。要进步改善的话,需要好的算法。。。
wangkeyunanjing 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 TimidSparrow 的回复:]
双缓冲绘图
基本思想是先在一个内存位图中将所有需要在屏幕显示的图画好,一次性显示到屏幕上。
另外,需要相应WM_ERASEBKGND消息,屏蔽掉系统的擦除窗口的功能。
[/Quote]

是的,就是在内存中存放两个“显示区”,每个“显示区”都是虚拟的屏幕的对象,同时维护它们,一个连贯的动作,奇数桢在第一个“显示区”上画,偶数桢在“第二个”显示区上画,

各种系统的API都有封装显卡的这一功能,即让显示器在多个“显示区”之间切换,来显示图像,切换的时候不是重画,因为“显示区”是事先画好的,不需要再花了,直接就显示出来了。

这些“显示区”一般都是先在显卡的缓存里,所以显卡的缓存越大,显卡通常就越好,因为这样就可以实现n个“显示区”之间的切换(或者每个“显示区”的像素各加细腻),实现更高质量的动画效果。

多个“显示区”的维护可以用多线池技术来做,以确保动画的流畅,真正要掌握这些,实在是很高深的技术啊,

不过如果LZ掌握了,可以考虑去暴雪哦, 祝好运。
TimidSparrow 2008-12-16
  • 打赏
  • 举报
回复
双缓冲绘图
基本思想是先在一个内存位图中将所有需要在屏幕显示的图画好,一次性显示到屏幕上。
另外,需要相应WM_ERASEBKGND消息,屏蔽掉系统的擦除窗口的功能。
SearchLife 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangkeyunanjing 的回复:]
引用 1 楼 TimidSparrow 的回复:
双缓冲绘图
基本思想是先在一个内存位图中将所有需要在屏幕显示的图画好,一次性显示到屏幕上。
另外,需要相应WM_ERASEBKGND消息,屏蔽掉系统的擦除窗口的功能。


是的,就是在内存中存放两个“显示区”,每个“显示区”都是虚拟的屏幕的对象,同时维护它们,一个连贯的动作,奇数桢在第一个“显示区”上画,偶数桢在“第二个”显示区上画,

各种系统的API都有封装显卡的这一功能…
[/Quote]

学习
lure2009 2008-12-16
  • 打赏
  • 举报
回复
双缓冲绘图,就是删掉 BitBlt(dc.m_hDC,0,0,800,600,BackDC,0,0,SRCCOPY); 这句 不刷新背景,而在ONOK加入这句,就不闪烁了,但是不能实现遮挡 和人物运动刷新。2楼的想法可能能实现,我得试试,又更简单点得方法吗?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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