产品展示网站建设,第三方小程序平台,公司网站可以免费建吗,优化企业网站大家好#xff0c;这里是Dark Flame Master#xff0c;专栏从这篇开始就会变得很有意思#xff0c;我们可以利用今天所学的只是实现很多功能#xff0c;同样为之后的更加好玩的内容打下基础#xff0c;从这届开始将会利用所学的知识制作一些小游戏#xff0c;废话不多说这里是Dark Flame Master专栏从这篇开始就会变得很有意思我们可以利用今天所学的只是实现很多功能同样为之后的更加好玩的内容打下基础从这届开始将会利用所学的知识制作一些小游戏废话不多说开始今天的内容。 专栏EasyX图形化编程 文章目录 动画键盘交互 动画
在之前的笔记中我们所绘制的图形都是静态的现在我们通过代码让图形动起来。 就像小时候我们看的葫芦娃小金刚一样动画是由一帧一帧的图片逐个快速播放利用人的视觉停留就可以达到动画的效果。一般来说电视每秒播放24帧画面游戏更高在打游戏时游戏帧率越高游戏画面也就越流畅。 用前边的知识绘制一个半径100圆形窗体大小800*600圆心初始坐标为-4000。颜色可以自己选择。
要实现像动画一样逐帧播放我们可以不断改变圆心的x坐标更改后清除上一次画的圆形然后重新画出位置变化的圆形同时要使用Sleep()函数暂停程序一段时间。
代码如下
int main()
{initgraph(800,600);setbkcolor(RGB(150, 205, 205));cleardevice();setorigin(400, 300);setaspectratio(1, -1);setfillcolor(RGB(106, 90, 205));int dx 15;for (int x -400; x 400; x dx){solidcircle(x, 0, 100);Sleep(200);cleardevice();}getchar();return 0;
}画出一个圆形后Sleep200毫秒清空屏幕后画出下一个再Sleep200毫秒。直到运动到最右端循环结束getchar阻塞进程。 运行后效果如下 因为休眠函数在每次循环时休眠200毫秒所以在一秒内可以播放五帧画面每次移动的距离为15像素所以圆形的移动速度为每秒75像素。 如果想让画面更加流畅然而圆形的移动速度几乎不变就要加大帧率减小每次移动的像素。 将休眠时间改为50毫秒将每次移动的像素即dx设置为5。 运行后效果如图 对比上边流畅很多。
键盘交互 在动画的基础上加入键盘交互功能按下w键圆形向上移动按下a键圆形向左移动按下d键圆形向右移动按下s键圆形向下移动。 首先如何从键盘上读取信息 我们会想到使用getchar函数有了思路就开始编写代码实现按下w键圆形向上移动50像素。
int main()
{initgraph(800,600);setbkcolor(RGB(150, 205, 205));cleardevice();setorigin(400, 300);setaspectratio(1, -1);int x 0;int y 0;setfillcolor(GREEN);solidcircle(x, y, 50);//画出圆形while (1){char c getchar();if (c w){y 50;}cleardevice();//清除窗体solidcircle(x, y, 50);//画出圆形}getchar();return 0;
}编写完成后运行代码发现按下’w’键没有任何反应按下回车后才会向上移动而且点击n次w键会直接向上移动n*50像素。这是为什么呢
让我们深入了解一下getchar函数 getchar函数从输入缓存区中读取一个字符如果读取成功就返回读取到的字符如果缓存区中没有数据函数将会阻塞进程直到缓存区里有数据。 在控制台上输入数据但数据还没有进入输入缓存区需要按下回车键才会将输入的全部数据放在缓存区然后getchar函数取出第一个字符并返回这个字符。若在循环中getchar会依次取出这些数据直到没有数据为止。 我们想让动画和键盘交互组合但getchar函数明显不满足需求想要实现实时型交互按下键盘后程序就作出反应而不是按下回车后才运行运行之后又堵塞。 这里就要提到getch函数 无需回车只需要按下键盘就可以将数据送进输入缓存区。 别忘记包含头文件conio.h 写一串代码探究其特性 注在使用getch函数时要写成_getch的形式。 代码如下
#include conio.h
int main()
{while (1){char c;c _getch();putchar(c - 32);}return 0;
}运行后输入小写a就直接在控制台打印出A输入b就直接打印B。 解决了回车问题我们想在圆形移动的时候就可以控制圆移动的方向而getch仍然具有阻塞程序运行的作用。这种用户输入之后场景才发生变化的适合推箱子游戏2048等然而对于就算没有输入整个场景仍然会变化的场景则不适用。 介绍一下函数kbhit int kbhit(void); kbhit函数会检查getch函数的输入缓存区中是否有数据若没有数据就返回0如果有数据就返回非0的数。 这个函数不会阻塞程序的运行可以借此判断是否用户按下了键盘然后再做出反应这样就不会阻塞程序的运行。kbhit函数也要写作_kbhit。 对前边的圆形动画做出改变加上键盘交互功能。 代码如下
int main()
{initgraph(800, 600);setbkcolor(RGB(150, 205, 205));cleardevice();setorigin(400, 300);setaspectratio(1, -1);setfillcolor(RGB(106, 90, 205));int x -400, y 0;int dx 5 , dy0;while (1){cleardevice();solidcircle(x, y, 50);Sleep(40);if (_kbhit() ! 0){char c _getch();switch (c){casew:dx 0;dy 5;break;casea:dx -5;dy 0;break;cases:dx 0;dy -5;break;cased:dx 5;dy 0;break;}}x x dx;y y dy;}getchar();return 0;
}起始位置在最左边刚开始设置dx为5即圆形向右移动只有我们按下键盘才会进入switch语句更改dx与dy的值从而实现在运动中改变运动的方向。 运行后效果如下
接下来会用今天所学的知识来实现一个简单的弹球小游戏。希望大家有所收获。