C++图形开发(8):空格键控制小球起跳

53 篇文章 3 订阅
19 篇文章 8 订阅

我们今天来实现下按下空格键控制小球的起跳(还没阅读之前文章的同学可以先去阅读一下: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;
}

效果展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值