让我们先回到在窗体内不停反弹的弹弹球。根据这个弹弹球为基础,增加更多的代码,再来讨论多物体及批量绘图的问题。
1. 窗体内反弹的小球
创建一个800 * 600的窗体。坐标系原点在窗体中心,x轴正方向向右,y轴正方向向上。背景色设置为RGB(164, 225, 202),最后调用cleardevice函数,使用背景色清空整个窗体。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
// 坐标系原点在窗体中心,X轴正方向向右,Y轴正方向向上
setorigin(400, 300);
setaspectratio(1, -1);
// 设置背景色
setbkcolor(RGB(164, 225, 202));
// 使用背景色清空窗体
cleardevice();
getchar();
closegraph();
return 0;
}
我们将弹球小游戏那一节中的,在窗体内碰到窗体边缘即反弹的小球代码拿过来,并略加修改。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
// 坐标系原点在窗体中心,X轴正方向向右,Y轴正方向向上
setorigin(400, 300);
setaspectratio(1, -1);
// 设置背景色
setbkcolor(RGB(164, 225, 202));
// 使用背景色清空窗体
cleardevice();
// 圆心坐标
int x = 0, y = 0;
// 速度分量
int vx = 5, vy = 5;
// 小球半径
int r = 20;
while (1)
{
// 清空画面
cleardevice();
// 绘制小球
solidcircle(x, y, r);
Sleep(40);
// 碰到或越过上下边界反弹
if (y >= 300 - r || y <= -300 + r)
{
vy = -vy;
}
// 碰到或越过左右边界反弹
if (x <= -400 + r || x >= 400 - r)
{
vx = -vx;
}
x += vx;
y += vy;
}
closegraph();
return 0;
}
小球初始情况下出现在屏幕中间的位置,也就是圆心坐标为(0, 0)
,并将半径设置为20。
设置x
方向与y
方向上的分量速度均为5像素/帧,这样小球的初始运动方向为正右上方向。
根据勾股定理可知小球的速度为:
按帧计算,小球运动速度为7像素/帧,设定每帧之间暂停40毫秒,若不计算绘图时间,每秒将有25帧。按秒计算,小球的速度为7 * 25 = 175像素/秒。