物体的阻尼运动

#include
#include

 

const int X=200,Y=50;    //程序窗口左上角相对于屏幕的坐标 
const int WIDTH=640,HEIGHT=480;  // //程序窗口的宽与高

DWORD tPre,tNow;    //tPre记录上一次绘图的时间,tNow记录此次准备绘图的时间
int x=0,y=0,vx=3,vy=0,gy=1;  //x、y表示物体的初始位置

HDC hdc,mdc,bufdc;
HBITMAP bg,dra;
RECT rect;

 

void MyPaint(HDC);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 const std::string szTitle="阻尼运动";

 WNDCLASS winclass={CS_HREDRAW|CS_VREDRAW,WndProc,0,0,hInstance,LoadIcon(NULL,IDI_APPLICATION),
  LoadCursor(NULL,IDC_ARROW),(HBRUSH)GetStockObject(WHITE_BRUSH),NULL,szTitle.c_str()};

 if(!RegisterClass(&winclass))
  return false;

 HWND hWnd=CreateWindow(szTitle.c_str(),szTitle.c_str(),WS_OVERLAPPEDWINDOW,X,Y,WIDTH,HEIGHT,
  NULL,NULL,winclass.hInstance,NULL);

 if(0==hWnd)
  return 0;

 ShowWindow(hWnd,SW_SHOWDEFAULT);
 UpdateWindow(hWnd);

 MSG msg;
 ZeroMemory(&msg,sizeof(MSG));

 while(msg.message!=WM_QUIT)
 {
  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
  else
  {
   tNow=GetTickCount(); 
   while(tNow-tPre>=30)
    MyPaint(hdc);
  }
 }
 return msg.wParam;
}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
 HBITMAP bmp;

 switch(message)
 {
 case WM_CREATE:
  {
   hdc=GetDC(hWnd);
   mdc=CreateCompatibleDC(hdc);
   bufdc=CreateCompatibleDC(hdc);
   bmp=CreateCompatibleBitmap(hdc,WIDTH,HEIGHT);
   SelectObject(mdc,bmp);

   //加载物体位图
   bg=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
   dra=(HBITMAP)LoadImage(NULL,"dra.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

   GetClientRect(hWnd,&rect);  //取得内部窗口区域大小
  }
  break;

 

 case WM_KEYDOWN:
  {
   if(wParam==VK_ESCAPE)
    DestroyWindow(hWnd);
  }
  break;

 case WM_DESTROY:
  {
   DeleteDC(bufdc);
   DeleteDC(mdc);
   DeleteObject(bg);
   DeleteObject(dra);
   ReleaseDC(hWnd,hdc);
   PostQuitMessage(0);
  }
  break;

 

 default:
  return DefWindowProc(hWnd,message,wParam,lParam);
 }
 return 0;
}

 

void MyPaint(HDC hdc)
{
 //贴背景图
 SelectObject(bufdc,bg);
 BitBlt(mdc,0,0,WIDTH,HEIGHT,bufdc,0,0,SRCCOPY);

 //贴物体图
 SelectObject(bufdc,dra);
 BitBlt(mdc,x,y,50,50,bufdc,50,0,SRCAND);
 BitBlt(mdc,x,y,50,50,bufdc,0,0,SRCPAINT);
 BitBlt(hdc,0,0,WIDTH,HEIGHT,mdc,0,0,SRCCOPY);

 
 x+=vx;  //计算x轴方向物体坐标
 vy+=gy;  //计算y轴方向速度分量
 y+=vy;  //计算y轴方向贴图坐标

 

 if(y>=rect.bottom-50)
 {
  y=rect.bottom-50;
  vx-=1;
  if(vx<0)
   vx=0;

  vy-=4;
  if(vy<0)
   vy=0;
  vy=-vy;
 }

 tPre=GetTickCount();
}

你可能感兴趣的:(Windows,API)