;
bmp = CreateCompatibleBitmap(hdc,750,400);
SelectObject(mdc,bmp);
bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,750,400,LR_LOADFROMFILE);
angrybird = (HBITMAP)LoadImage(NULL,"angrybird.bmp",IMAGE_BITMAP,140,70,LR_LOADFROMFILE);
GetClientRect(hWnd,&rect);
MyPaint(hdc);
return TRUE;
}
//****自定义绘图函数*********************************
// 1.窗口贴图
// 2.根据小球的运动状态计算速度与贴图坐标
void MyPaint(HDC hdc)
{
SelectObject(bufdc,bg);
BitBlt(mdc,0,0,750,400,bufdc,0,0,SRCCOPY);
SelectObject(bufdc,angrybird);
BitBlt(mdc,x,y,70,70,bufdc,70,0,SRCAND);
BitBlt(mdc,x,y,70,70,bufdc,0,0,SRCPAINT);
BitBlt(hdc,0,0,750,400,mdc,0,0,SRCCOPY);
x += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个vx的当前值
vy = vy + gy; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度)
y += vy; //计算Y轴方向贴图坐标,每调用一次MyPiant(),y坐标就加上一个刚改变过后的vy,相当于加速运动
if(y >= rect.bottom-70) //判断是否触地,如果触碰到窗口边界,进行调整
{
y = rect.bottom - 70;
//X轴方向的摩擦力处理
vx += fx; // vx=fx+vx;这里fx为负值,所以每调用一次MyPiant(),vx恒定减小一个fx
if(vx < 0) //当vx值递减到小于0时,就将其设为0,即小球在X方向不再移动。
vx = 0;
//Y轴方向摩擦力处理
vy += fy; //vy=fy+vy;这里fy同样为负值,所以每调用一次MyPiant(),vy恒定减小一个fy
if(vy < 0) //若速度减到小于等于0,置为零,即小球在X方向不再移动。
vy = 0;
vy = -vy;
}
tPre = GetTickCount(); //记录此次时间
}
//****消息处理函数***********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_KEYDOWN: //按键消息
if(wParam==VK_ESCAPE) //按下【Esc】键
PostQuitMessage(0);
break;
case WM_DESTROY: //窗口结束消息
DeleteDC(mdc);
DeleteDC(bufdc);
DeleteObject(bg);
DeleteObject(angrybird);
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
break;
default: //其他消息
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
下面是运行时的截图:
最后小鸟能量耗尽,停留在窗口边缘的地面上。
作者:zhmxy555