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

弹球游戏

见程序运行图,其实就是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是一样的,不论处理定时器还是键盘消息都是和基础相同的,只是增加了一些判断。

这一些小小的台阶,就让我们的小游戏初步的可以玩了~

基础非常重要,而基础之间的连接和组合更加的重要!





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值