VC绘图/游戏简易教程--7:捕获按键,实现动画的简单控制
作者:BestAns

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

最常用的一个捕获按键的函数:getch()
前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键:
char c = getch();

然后再做判断即可。

不过程序执行到 getch() 是会阻塞的,直到用户有按键才能继续执行。可游戏中总不能因为等待按键而停止游戏执行吧?所以,要有一个函数,判断是否有用户按键:kbhit()
这个函数返回当前是否有用户按键,如果有,再用 getch() 获取即可,这样是不会阻塞的。
即:

char c;
if (kbhit())
	c = getch();

举一个简单的例子,如果有按键,就输出相关按键。否则,输出“.”。每隔 100 毫秒输出一次。按 ESC 退出。
注:ESC 的 ASCII 码是 27。

完整代码如下:

#include <graphics.h>
#include <stdio.h>
#include <conio.h>

void main()
{
	char c = 0;
	while(c != 27)
	{
		if (kbhit())
			c = getch();
		else
			c = '.';
		
		printf("%c", c);
		Sleep(100);
	}
}

结合上一课的简单动画,就可以做出来靠按键移动的图形了吧,看以下代码,实现 a s 控制圆的左右移动:

#include <graphics.h>
#include <conio.h>

void main()
{
	initgraph(640, 480);
	
	int x = 320;
	
	// 画初始图形
	setlinecolor(YELLOW);
	setfillcolor(GREEN);
	fillcircle(x, 240, 20);
	
	char c;
	while(c != 27)
	{
		// 获取按键
		c = getch();
		
		// 先擦掉上次显示的旧图形
		setlinecolor(BLACK);
		setfillcolor(BLACK);
		fillcircle(x, 240, 20);
		
		// 根据输入,计算新的坐标
		switch(c)
		{
			case 'a': x-=2; break;
			case 'd': x+=2; break;
			case 27: break;
		}
		
		// 绘制新的图形
		setlinecolor(YELLOW);
		setfillcolor(GREEN);
		fillcircle(x, 240, 20);
		
		// 延时
		Sleep(10);
	}
	
	closegraph();
}

[作业]

请继续完成这个程序,实现以下功能:

  1. 上下的控制;
  2. 边界检测;
  3. 结合 kbhit 实现惯性移动(即按一下方向键,圆就会一直向这个方向移动)

注:上下左右等按键的控制,会返回 2 个字符。由于该系列教程面向初学者,因此有兴趣的请查看 MSDN。

更新时间:2010/4/27