淘先锋技术网

首页 1 2 3 4 5 6 7

分析程序

从程序的运行效果来看,白色的小球在黑色的背景下,从左上角出发作平抛运动,当小球达到最底面和最右边的边界的时候会反弹。注意观察的话,小球的白色是非常特别的,请原谅我这一个理科生不知道用专业术语来描述,视觉上来看,就是有一束光照着小球,让小球出现了明暗的变化,非常有立体感。除此之外,没有什么特别的,程序运行的效果并不复杂。

 

分析源代码

本人对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;

};


Sphere 的实现代码cpp文档中,大多数代码 一看就懂,但是最关键的就是CSphere::Draw(CDC* pDC, int x ,int y)这个函数,这直接关系到如何画出一个具有立体感的小球

其中也删除了一些不与本文无关的函数:如析构函数

//在构建函数中,也就是创建一个小球的时候,需要一个参数,即小球的半径
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-----漫反射区域绘制次数