VC++动画图形绘制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.2.3 调色板动画举例
6.2.3 调色板动画举例
创建一个基于对话框的应用程序,在对话框的四周车许多小圆表示灯炮,程 序运行时各个小圆的颜色发生变化,好像门上闪烁的灯。
6.3帧动画
6.3.1帧动画原理
帧动画也称页动画或全屏幕动画。 动画程序预先建立许多幅全屏幕图像,并将每幅图像都存起来。 每幅图像也称为一帧面,播放时程序依次显示每幅图像,形成动画。 常用于复杂的整屏三维动画。
• 在构造方法中初始化flag=0;
第二步:增加鼠标左键消息处理及代码
6.1.2异或动画举例


CDC * dc = GetDC(); //取得绘图设备环境上下文指针 CPen newpen(PS_SOLID,0,RGB(255,0,0)); //创建新的画笔 CPen * oldpen; if(flag ==0){ //第一次按下鼠标左键时 flag=1; start=end=point; }else{ //第二次按下鼠标左键时 oldpen=dc->SelectObject(&newpen);//将新画笔选进设备上下文中,将原设备 上下文存于旧画笔中 dc->SetROP2(R2_XORPEN); //设备画线模式为异或 dc->MoveTo(start); //移动到起点 dc->LineTo(end); //画线到终点,将这前所画线条用异或模式擦除 end=point; //重新设臵终点 dc->SetROP2(R2_XORPEN);//设备画线模式为异或 dc->MoveTo(start); dc->LineTo(end); dc->SelectObject(oldpen); //将旧画笔选进设备上下文 flag=0; //还原状态 } ReleaseDC(dc);
模仿出流动的水、空气和亮度等变化。 侦动画:(翻页式动画)是将动画所有的侦准备好,然后快速地切换每一侦 画面,由此形成动画。 块动画:将显示对象分为背景和前景两部分,背景不发生改变面前景不断变 化,便显示出动画效果。 实时动画:在动画过程中实时地绘制图形,至少需要两个图形页,当在一页
上绘制图形时另一而被显示出来,如此循环切换来显示动画。
第五章 动画图形绘制
提问与答疑!来自百度文库
利用现成的动画制作软件,如二维的Flash工具、三维的3DMAX工具等。
• 生成动画比较方便、快速,制作人员无需掌握编程知识,在较短的时间内就能学会。
直接通过编写程序来生成动画
• 要求制作人员具备一定的程序设计知识,动画编程技巧。
利用计算机编程可产生5种类型的动画:异或动画、调色板动画、侦动画、 块动画和实时动画。
6.2.2 生成调色板动画的步骤
6.2.2生成调色板动画的步骤 1.声明一个调色板对象,并将它初始化 2.创建几把画刷,每把画刷用标志臵成0x01的值以初始化,这表明每个 画刷的颜色都是一个指定调色板位臵的索引 3.设臵一个定时器,用它来控制隔多长时间将屏幕重画。 4.用创建的每把刷子各画一个物体。 5.每隔一定时间调用调色板的操作函数AnimatePalette来改变每把画刷 的索引 最后的结果就是看起来屏幕上的每个物体在不停地移动,实际上是它们 的颜色在发生改变。
6.3帧动画
6.3.2程序举例及说明
定义变量: • CFrameDoc* GetDocument(); • CDC m_pdcMemory[2]; //设备上下文指针数组 • CBitmap m_pBitmap[2]; //位图指针数组 • CSize m_sizeDest; //目标区域大小 • CSize m_sizeSource; //源块大小 • BOOL flag; //标志,是否播放动画 • int index; //画面序号 设臵默认状态(View的构造函数中) • Flag=FALSE; • Index=0;
6.3.2制作帧动画
首先:把第一帧画面建立起来。
• 一般情况每帧的场景都非常复杂,习惯上都是用其他图形图像处理软件来实 现。 • 由于每一秒至少需要24帧画面才能取得比较好的效果,所以工作量非常大, 而且需要的时间也比较多。
其次:用动画播放程序来播放每一帧画面,当每一帧都比较小时可以一 次将所有帧都读入内存,然后按照一定时间间隔连续显示每一帧画面。
如此循环下去,就可以看到一个物体在运动,可形成动画。
6.1.2异或动画举例
例子:在交互式绘图中用户想画一条直线,首先按下鼠标左键确定直线起点, 接着移动鼠标,这时会有一条直线随着鼠标移动,直到用户松开左键为止, 这条随鼠标移动的直线称为“像皮筋”。 第一步:定义两个变量 • CPoint start,end;//直线的起点和终点 • int flag;//标志:第一次鼠标左键:0 第二鼠标左键:1
6.4.2 块动画的制作过程
准备好一幅背景图画和一幅前景图(子画面) 显示背景图 确定子图画面将显示的位臵,将可能被子画面覆盖的背景保存起来 显示子画面 更新位臵变量 恢复背景,并将新位臵的背景保存起来; 在新位臵显示子画面; 返回第5步。
6.4 块动画
6.4.3 程序举例及说明
6.1异或动画
6.1.1异或动画原理
绘制图形时使用异或光栅操作代码,即R2_XORPEN代码, R2_XORPEN表将画 笔和屏幕颜色进行异或运算,它们是绘制图形的基础,也是这种绘制方法 名的由来。最后结果是两种颜色的异或,异或运算规则见下表:
A 0 0 B 0 1 A XOR B 0 1
第五章
动画图形绘制
主讲:刘利军 E-mail:CloneIQ@126.com
生物医学工程系 2009级 计算机绘图
概述
计算机动画:借助计算机生成一系列供动态演示图形的技术。 动画技术在CAD、CAM、CAI等许多领域里都有广泛应用 动画直观、形象等特点,在模拟仿真领域也有关非常重要的地位。 如模拟航空器飞行,能使飞行员在计算机上处理实际飞行中可能出现的 问题。 计算机生成动画的两种途经:
6.1.2异或动画举例
第三步:增加鼠标移动消息处理及代码
CDC * dc = GetDC(); CPen newpen(PS_SOLID,0,RGB(255,0,0)); CPen * oldpen=dc->SelectObject(&newpen); dc->SetROP2(R2_XORPEN); if(flag==1){ dc->MoveTo(start); dc->LineTo(end); end = point; dc->MoveTo(start); dc->LineTo(end); } dc->SetROP2(R2_XORPEN); dc->SelectObject(oldpen); ReleaseDC(dc);
6.4 块动画
6.4.1 块动画原理
块动画又称为子画面动画、部分屏幕动画 显示对象分成两部分:背景和前景 背景通过不发生变化,前景不断地运动、改变,只要将背景画一次,不断更新前 景就形成了块动画。 由于每次不需要刷新整个屏幕,而仅仅是一小部分,所以可以获得很高的动画速 度。 许多电脑游戏中能看到这种动画,如背景上面有坦克或飞机到处移动。
增加定时器及响应消息(onTimer) if(flag){ if(index==0) • index=1; else index=0; Invalidate();} 初始化更新 m_pBitmap[0].LoadBitmap(IDB_BITMAP1);//将位臵装入内存 m_pBitmap[1].LoadBitmap(IDB_BITMAP2); for(int i=0;i<2;i++){ • CClientDC dc(this);//创建关于窗口客户区的设备上下文 • OnPrepareDC(&dc); // 在调用屏幕显示的重绘函数前应先调用 • m_pdcMemory[i].CreateCompatibleDC(&dc);//创建兼容的内存设备上下文 • m_pdcMemory[i].SelectObject(&m_pBitmap[i]);//将位图选进内存设备上下文 • m_pBitmap[i].GetObject(sizeof(bm), &bm);//得到位图的长和宽 • m_sizeSource.cx = bm.bmWidth;//初始化源块大小 • m_sizeSource.cy = bm.bmHeight; • m_sizeDest = m_sizeSource; //将源块大小赋予目标区域 • dc.DPtoLP(&m_sizeDest);} //将设备坐标转换成逻辑坐标 int nTimer=SetTimer(1,200,NULL);//设臵定时器 ASSERT(nTimer!=0);
1
1
0
1
1
0
6.1.1异或动画原理
第一次异或方式在屏幕上某一位臵画图时,最后的结果是画笔颜色和屏幕颜 色的异或。 第二次在相同位臵用异或方式重画后,最后的结果又变回屏幕原来的颜色, 也就是将第一次所画的物体擦除了。 由于是位运算,速度非常快,不会出现闪烁现象。 在某一开始位臵用异或的方式画一物体,然后隔一定的时间间隔在上次的位 臵再画一次,然后沿某个方向移动一微小距离,在新的位臵将物体再画一遍,
onDraw函数 • CFrameDoc* pDoc = GetDocument(); • if(flag){//当播放时 • pDC->SetStretchBltMode(COLORONCOLOR);//设臵位图拉伸模式(采用保存彩 色位图颜色模式) • //将指定内存位臵大小的位图在屏幕上显示出来 • pDC->StretchBlt(100, 50, m_sizeDest.cx, m_sizeDest.cy, • &m_pdcMemory[index], 0, 0, • m_sizeSource.cx, m_sizeSource.cy, SRCCOPY); • } 定义菜单及消息(OnViewPlay) • if(flag){ //如果flag为真,则播放动画,否则清屏 flag=FALSE; Invalidate(); • }else flag=TRUE;
6.2调色板动画
6.2.1调色板动画原理 一个调色板包含一组256个24位的RGB颜色值。 调色板不同颜色就不同,最多有256种,从0-255 索引:在显示缓存中,每个像素都有一个从0-255的值。 这个像素值指出了使用调色板中的哪种颜色给该像素着色。 改变像素颜色的方法:改变像素的索引值,使其指向调色板中拐一项; 改变调色板的RGB值。注意:第二种方法将导致屏幕上所有使用该调色板 项值的像素的颜色都发生变化。 缺点:整个屏幕只能显示256种颜色,而不是针对某个窗口或应用程序。 优点:使未压缩的图像文件比真彩色图像小三分之二;可以使用Windows 固有的调色板操作函数执行一种比较流行且经济的动画--调色板动画。 调色板动画就是通过有规律地改变每个像素的索引值,使得屏幕上每个 像素的颜色发生变化,形成一种动感。能很好地模仿出流动的水、空气、 亮度等变化效果。
动画类型简介
异或动画:利用异或方式在原来位臵重画,就能快速地擦除刚才的画的物体, 然后在新位臵显示出来。 异或操作:异或是一个数学运算符。他应用于逻辑运算。 其运算法则为 a异或b=a‘b+ab’(a‘为非a)。例如:00001111异或11111111=11110000
调色板动画:通过将各个像素点的颜色按一定的方式进行循环变化,就可以
相关文档
最新文档