目录
我们这一节将结合动画和键盘交互的知识来做一个小游戏
1.需求
我们先看需求:小球在窗体内运动,撞到除了底边外的另外三个边缘就反弹一次,如果小球撞到底边,游戏结束。玩家可以控制在底边上的一个挡板,让小球撞击到挡板上而反弹,阻止小球撞到底边
2.运动的小球
这里我们先绘制好一个圆形
#include<easyx.h>
#include<stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
setbkcolor(RGB(164, 225, 202));
cleardevice();
setfillcolor(WHITE);
solidcircle(0, 0, 40);
getchar();
return 0;
}
接下来我们想让小球一开始就往右上方运动,也就是说它的速度和x轴的夹角是45度
我们假设vx=5,vy=5,则
我们再考虑一下帧率的问题
这样子,小球就可以往右上方运动了
我们看代码
#include<easyx.h>
#include<stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
setbkcolor(RGB(164, 225, 202));
cleardevice();
setfillcolor(WHITE);
solidcircle(0, 0, 40);
int x = 0, y = 0;
int vx = 5, vy = 5;
int r = 40;
while (1)
{
cleardevice();
solidcircle(x, y, r);
Sleep(40);
x += vx;
y += vy;
}
getchar();
return 0;
}
3.碰到边缘反弹
我们需要将小球的运动范围限制在窗体内,让小球在碰到窗体边缘后反弹
当小球碰到最上方时,只需将vy改为-vy即可
这样就会引出一个新的问题
有的人说可以将y==300设置为终端条件,但是事实上,这个效果和我们理想的状态好像不太一样
因此我们使用区间来判断将更加通用
当y>=300时,使vy反向即可
#include<easyx.h>
#include<stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
setbkcolor(RGB(164, 225, 202));
cleardevice();
setfillcolor(WHITE);
solidcircle(0, 0, 40);
int x = 0, y = 0;
int vx = 5, vy = 5;
int r = 40;
while (1)
{
cleardevice();
solidcircle(x, y, r);
Sleep(40);
if (y >= 300)
{
vy = -vy;
}
x += vx;
y += vy;
}
getchar();
return 0;
}
同样的,对与两边的墙,我们可以使用相同的思路
我们接着修改代码
#include<easyx.h>
#include<stdio.h>
int main()
{
initgraph(80