本节讲解如何实现小球的自由落体运动效果,完整代码参见配套资源中的2-2.cpp,扫描右侧二维码观看视频效果“2.2 小球的自由落体”。下面对2-2.cpp中的一些关键内容进行讲解,代码对应的行号是它们在2-2.cpp中的行号。
2.2 小球的自由落体
首先用一个小球表示游戏中的小鸟,定义结构体记录小球圆心的横、纵坐标 x 、 y ,纵轴方向的速度vy,半径radius,代码如下。
2-2.cpp
8 struct Bird // 小鸟结构体 9 { 10 float x, y, vy, radius; // 小球圆心坐标(x,y)、y轴方向的速度vy、半径 radius 11 };
在程序开头,使用宏定义的形式设定画面的宽度WIDTH、高度HEIGHT、重力加速度G,代码如下。
2-2.cpp
4 #define WIDTH 800 // 游戏画面宽度 5 #define HEIGHT 600 // 游戏画面高度 6 #define G 0.3 // 重力加速度
在while循环语句中,首先根据重力加速度G计算速度vy,然后利用vy更新小球圆心的纵坐标y,从而实现小球加速下落的效果,代码如下。
2-2.cpp
24 while (1) // 一直循环 25 { 26 bird.vy = bird.vy + G; // 根据重力加速度更新小球在y方向的速度 27 bird.y = bird.y + bird.vy; // 根据小球在y方向的速度更新其圆心 的纵坐标
当小球碰到画面的下边界时,重新设置小球圆心的纵坐标y,代码如下。
2-2.cpp
29 if (bird.y >= HEIGHT - bird.radius) // 如果小球碰到画面的下边界 30 { 31 bird.y = HEIGHT / 6; // 重新设置小球圆心的纵坐标 32 bird.vy = 0; // 小球在y方向的初始速度设为0 33 }
更新小球的速度和位置后,依次执行清空画面、绘制新位置的小球、暂停10毫秒,即可实现小球重复加速下落的动画效果,代码如下。
2-2.cpp
35 cleardevice(); // 清空画面 36 fillcircle(bird.x, bird.y, bird.radius); // 绘制小球 37 Sleep(10); // 暂停10毫秒