您的位置:首页 > 其它

win32强化练习3.5_弹球游戏(键盘+定时器)

2016-11-22 20:21 267 查看
弹球游戏

见程序运行图,其实就是1通过定时器使小球运动+2键盘控制下方挡板,挡住则小球反弹,挡不住则失败。



这个相当于3.1和3.3的组合体,并且增加了一些碰撞的判断,实现步骤如下:
1. 声明全局变量和常量(小球和板的坐标,小球的运动方向)
2. 处理WM_PAINT消息,选绘制小球和板,使用相对坐标(基准+偏移)
3. 处理WM_KEYDOWN消息,使板能左右移动 (左右边界偷懒没有控制)
4. 在WM_CREATE消息处理中,开启定时器
5. 最后,处理WM_TIMER消息,让小球坐标变化,并进行各种反弹判定和失败判定

int gXball, gYball, gXbat; //小球x,y坐标;板的x坐标
const int gYbat= 220; //板的Y坐标不变
int vx = 1, vy = 1; //小球的x,y向速度
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
Rectangle(hdc, gXbat, gYbat, gXbat + 80, gYbat + 10);
Ellipse(hdc, gXball, gYball, gXball+30, gYball+30);
EndPaint(hwnd, &ps);
}
break;
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_LEFT: gXbat -= 10;	break;
case VK_RIGHT: gXbat += 10;	break;
default:
break;
}
InvalidateRect(hwnd, NULL, TRUE);	//重绘
}
break;
case WM_CREATE:
SetTimer(hwnd, 10, 10, NULL);
break;
case WM_TIMER:
{
RECT rt;
GetClientRect(hwnd, &rt);
if (gXball < 0 || gXball > rt.right - 30) vx *=-1; //左右反弹
if (gYball < 0) vy*= -1;			//上边界反弹
if (gYball + 30 == 220)				//是否碰到板反弹
{
if (gXball + 15 > gXbat && gXball + 15 < gXbat + 80)
vy *= -1;
}
if (gYball + 30 == rt.bottom)	//失败判定
{
KillTimer(hwnd, 10);
MessageBox(hwnd, "失败","",0);
}
gXball += vx;
gYball += vy;
InvalidateRect(hwnd, NULL, TRUE);	//重绘
}
break;


由这个练习看到,基础还是和3.1和3.3是一样的,不论处理定时器还是键盘消息都是和基础相同的,只是增加了一些判断。
这一些小小的台阶,就让我们的小游戏初步的可以玩了~
基础非常重要,而基础之间的连接和组合更加的重要!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WIN32