分析程序
从程序的运行效果来看,白色的小球在黑色的背景下,从左上角出发作平抛运动,当小球达到最底面和最右边的边界的时候会反弹。注意观察的话,小球的白色是非常特别的,请原谅我这一个理科生不知道用专业术语来描述,视觉上来看,就是有一束光照着小球,让小球出现了明暗的变化,非常有立体感。除此之外,没有什么特别的,程序运行的效果并不复杂。
分析源代码
本人对MFC并不熟悉,分析的正确性不能保证,但会尽量理解每一句代码。
本程序运用了MFC框架(单文档),所以看起来有非常多有的代码。但是经过我分析,其中的两个类最重要,实时动画view 和Sphere,由此相关的头文件和实现代码cpp文档,共4份:Sphere.h、实时动画View.h、实时动画View.cpp、Sphere.cpp。因此,下面我将分成两部分逐一解析源代码中的重要部分。
此外,了解到代码的执行流程也是非常有必要的,最简单的情况下:
程序启动时,首先执行CMyView::int OnCreate(LPCREATESTRUCT lpCreateStruct);
接着绘制画面:CMyVIew::void OnDraw(CDC* pDC);
每个一段时间便会执行的: CMyVIew::void OnTimer(UINT nIDEvent);
由于void OnTimer的不断执行,小球的额x,y不断改变,才导致了小球的运动的效果。
下面的类图和序列图,能帮助我们更好的理解:
Sphere
我们完全可以剥离该程序来分析这个类,换句话说,该类具有非常高的可移植性,这也是面向对象编程的好处。
首先看该类的头文件,除了 扩散色区域的逼近次数 和 高光区域的逼近次数只有在cpp文件里详细解释以外,其他的没有需要的再说明的了。
class CSphere
{
public:
CSphere(int nRadius);
virtual ~CSphere();
public:
void SetColor(BYTE byRed, BYTE byGreen, BYTE byBlue);
void SetPrecision(int nDifPrecision, int nSpePrecision);
void Draw(CDC* pDC, int x, int y);
private:
//半径
int m_nRadius;
//主体颜色
BYTE m_byRed, m_byGreen, m_byBlue;
//精细程度
//扩散色区域的逼近次数
int m_nDifPrecision;
//高光区域的逼近次数
int m_nSpePrecision;
};
其中也删除了一些不与本文无关的函数:如析构函数
//在构建函数中,也就是创建一个小球的时候,需要一个参数,即小球的半径
CSphere::CSphere(int nRadius)
{
m_nRadius = nRadius;//当创建一个小球的时候,需要一个参数,即小球的半径
//构造函数里也是直接对小球的一些属性进行了赋值
if(m_nRadius < 1) m_nRadius = 1;
m_byRed = 192;
m_byGreen = 192;
m_byBlue = 192;
m_nDifPrecision = 8;
m_nSpePrecision = 4;
}
//设置虚拟球的主体颜色
void CSphere::SetColor(BYTE byRed, BYTE byGreen, BYTE byBlue)
{
m_byRed = byRed;
m_byGreen = byGreen;
m_byBlue = byBlue;
}
//设置扩散区域和高光区域的逼近精度
//nDifPrecision-----漫反射区域绘制次数