文章目录
- 1.绘制小球
- 2.按下空格让小球跳起来
我们今天来实现下按下空格键控制小球的起跳(还没阅读之前文章的同学可以先去阅读一下:C++图形开发专栏)
1.绘制小球
首先,我们要绘制小球,这里就不细讲啦,之前的文章里都有,新内容看一下注释:
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
int main() {
double width, height;//定义画面长度、宽度
width = 600;
height = 400;
initgraph(width, height);
int ball_x, ball_y, r;//定义小球x轴、y轴、半径
r = 20;
ball_x = width / 4;//x坐标等于整个画面x轴长度的四分之一
ball_y = height - r;//y坐标等于画面的y轴长度减去圆的半径(保证圆在画面的最底端)
cleardevice();
fillcircle(ball_x, ball_y, r);
_getch();
closegraph();
return 0;
}
运行效果:
2.按下空格让小球跳起来
我们要让小球跳起来,其实就是让小球y方向的坐标发生变化,如图:
要让小球跳起来,那显然就需要定义一个变量来调整小球的速度和重力加速度:
int ball_vy = 0;//最初小球落在地面上时y轴方向的速度显然应该为0
double g = 0.6;//重力加速度
然后就是构造循环体实现球的起跳:
while (1){
ball_vy = ball_vy + g;//根据牛顿力学定律得
ball_y = ball_y + ball_vy;//小球y轴方向的变化
if (ball_y >= height - r) {
ball_vy = 0;//小球落地以后速度清零
ball_y = height - r;
}
cleardevice();
fillcircle(ball_x, ball_y, r);
Sleep(10);
}
但是……就只有以上的代码的话小球是无法移动的,因为小球y轴方向的速度(ball_vy)为0,所以,我们要通过检测按键来实现按下空格后更改y轴方向的速度使小球跳起:
if (_kbhit()) {
char input = _getch();
if (input == ' ') {
ball_vy = -16;
}
}
在以上代码中,_kbhit()
是一个函数,作用是检查键盘上是否有输入字符,如果有则返回一个非零值,否则返回零。
在实际编程中,可以利用_kbhit()
函数来检测用户是否有键盘输入,从而进行相应的操作。比如,可以在游戏中检测用户按下了哪个键盘上的按键,或者在命令行中读取用户输入的命令等。
在以上代码中,我们是通过如果检测到键盘有输入,就执行if内的语句
而我们将_getch()
所获得的键盘输入的内容储存在一个名为input的char类型变量中,接着在下面的if语句中检测输入内容,若输入的内容为空格,就将小球y轴方向的速度(ball_vy)更改为-16,从而使小球的y轴坐标减少,来达到向上“跳起”的效果
注意:这里所有的g(重力加速度)与ball_vy所更改的值都是经过反复试验所得到的效果较理想的值,也可以自行修改
那么整个一段代码就是:
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
int main() {
double width, height;//定义画面长度、宽度
width = 600;
height = 400;
initgraph(width, height);
double ball_x, ball_y,ball_vy, r,g;//定义小球x轴、y轴、y轴方向的速度、半径、重力加速度
g = 0.6;
r = 20;
ball_x = width / 4;//x坐标等于整个画面x轴长度的四分之一
ball_y = height - r;//y坐标等于画面的y轴长度减去圆的半径(保证圆在画面的最底端)
ball_vy = 0; //最初小球落在地面上时y轴方向的速度为0
while (1){
if (_kbhit()) {
char input = _getch();
if (input == ' ') {
ball_vy = -16;
}
}
ball_vy = ball_vy + g;//根据牛顿力学定律得
ball_y = ball_y + ball_vy;//小球y轴方向的变化
if (ball_y >= height - r) {
ball_vy = 0;//小球落地以后速度清零
ball_y = height - r;
}
cleardevice();
fillcircle(ball_x, ball_y, r);
Sleep(10);
}
_getch();
closegraph();
return 0;
}
效果展示: