17.多物体运动

  • 学习人数 15K+
  • 适合有C语言基础人群学习
avatar
林耿亮

你好编程主讲老师

让我们先回到在窗体内不停反弹的弹弹球。根据这个弹弹球为基础,增加更多的代码,再来讨论多物体批量绘图的问题。

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像素/秒