1.键盘消息函数
1) getch(); //需要头文件 conio.h
2) GetAsyncKeyState(键值); //需要头文件 windows.h 但是由于Easyx包含了windows头文件,所以无需自己包含(其他需要windows头文件的函数也一样,但是需要在graphics.h的下方包含:比如放音乐的头文件mmsystem.h
getch();需要使用返回值来判断
1)与非ASCII表字符的按键比较,需要使用虚拟键值
上:72 下:80 左:75 右:77
2)如果是与字母比较直接写字母,比如‘A’
GetAsyncKeyState(键值);需要传一个键值,如果按下返回真
上:VK_UP 下:VK_DOWN 左:VK_LEFT 右:VK_RIGHT
//因为运行后有图片,小球不断移动,图片会一闪一闪的,比较明显
//闪屏的原因,因为窗口在绘图,当小球不断移动,会不断地刷新,cleardevice()不断的清除,每一个流程我们都能看见,看见了不连贯就会卡,所以引出,在我们内存中创建一个和窗口一样大的缓冲区,画图的时候先在缓冲区里画图,这个是缓冲区我们看不到的,当缓冲区画完再显示到你能看见的窗口上,让你看见完整的画,会补帧。
//解决办法
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
//使用_getch()注意_getch()和getch()功能一样
int main()
{
initgraph(640, 480, SHOWCONSOLE);
int x = 0, y = 0;
while (1)
{
//双缓冲绘图需要放在绘图代码之前和之后//13行和24行
BeginBatchDraw();
setbkcolor(WHITE);//白色
cleardevice();
加载图片
IMAGE img;
loadimage(&img, "./1604456741637674.jpg", 100, 100);
putimage(0, 0, &img);
//控制球移动
setfillcolor(BROWN);
fillcircle(x, y, 20);
//EndBatchDraw();
FlushBatchDraw();//FlushBatchDraw()比EndBatchDraw();稳定一点
//键盘函数2,这个可以斜着移动
if (GetAsyncKeyState(VK_UP))//上
{
y -= 5;
}
if (GetAsyncKeyState(VK_DOWN))//下
{
y += 5;
}
if (GetAsyncKeyState(VK_LEFT))//左
{
x -= 5;
}
if (GetAsyncKeyState(VK_RIGHT))//右
{
x += 5;
}
键盘函数1
// //getch()函数返回字符,为了兼容最好写_getch()
//if (_kbhit())
//{
// char key = _getch();
// //阻塞函数,不输入就一直在这里等
// //所以包括到if(kbhit)里面,kbhit函数
// //判断有没有键盘按下有返回真反之为假
// //vs2022下kbhit()不能用加上前面加上_就好了
// printf("%d %c\n", key, key);
// /*(控制台上的输出)
// 输出 -32 ? //这是函数自动返回的值
// 72 H //72对应字符是H
// - 32 ?
// 80 P
// - 32 ?
// 75 K
// - 32 ?
// 77 M
// */
// switch (key)
// {
// case 72://上键
// case 'w':
// case 'W'://将w和W定义为上键
// y -= 5;
// printf("上键\n");
// break;
// case 80://下键
// case 's':
// case 'S'://将w和W定义为下键
// y += 5;
// printf("下键\n");
// break;
// case 75://左键
// case 'a':
// case 'A'://将w和W定义为左键
// x -= 5;
// printf("左键\n");
// break;
// case 77://右键
// case 'd':
// case 'D'://将w和W定义为右键
// x += 5;
// printf("右键\n");
// break;
// }
//}
}
getchar();
closegraph();
return 0;
}
运行结果