怎么实现游戏遮挡,且不闪烁刷屏
怎么实现游戏遮挡,且不闪烁刷屏。我想要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);
}