屏幕图象与动画技术

上传人:E**** 文档编号:109395379 上传时间:2019-10-26 格式:PDF 页数:12 大小:237.73KB
返回 下载 相关 举报
屏幕图象与动画技术_第1页
第1页 / 共12页
屏幕图象与动画技术_第2页
第2页 / 共12页
屏幕图象与动画技术_第3页
第3页 / 共12页
屏幕图象与动画技术_第4页
第4页 / 共12页
屏幕图象与动画技术_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《屏幕图象与动画技术》由会员分享,可在线阅读,更多相关《屏幕图象与动画技术(12页珍藏版)》请在金锄头文库上搜索。

1、屏幕图象与动画技术 一个简单的实现方法 这种简单方法利用 cleardevice()和 delay()函数相互配合,先画一幅图形,让它延 迟一个时间,然后清屏,再画另一幅,如此反复,形成动态效果。本小节的例程 3-28 分别通过函数 graphone(),graphtwo()和 graphthree()实现了三个简单的动画画面,这 三个画面不停地进行切换。 /*例程 3-28*/ #include #include #include int x,y,maxcolor; void graphone(char *str); /*这个函数实现的是字符串 str 左右运动, 线条上下运动 */ voi

2、d graphtwo(char *str); /*这个函数实现的是字符串 str 上下运动, 线条左右运动 */ void graphthree(char *str); /*这个函数实现的是字符串 str 由小变大,再由大变小,直线也随之变化*/ main() int i,driver,mode; char *str=“W E L C O M E !“; driver=DETECT; mode=0; initgraph( /系统初始化 cleardevice(); / 清屏 settextjustify(CENTER_TEXT,CENTER_TEXT); / 设置字符串的定位模式 x=getm

3、axx(); / 返回当前图形模式下的最大有效的 x 值 y=getmaxy(); / 返回当前图形模式下的最大有效的 y 值 maxcolor=getmaxcolor(); / 返回当前图形模式下的最大有效的颜色值 while(!kbhit() graphone(str); / 第一个动画 graphtwo(str); / 第二个动画 graphthree(str); / 第三个动画 getch(); closegraph(); / 关闭图形模式 void graphone(char *str) int i; for(i=0;i40;i+) setcolor(1); settextstyle

4、(1,0,4); setlinestyle(0,0,3); cleardevice(); line(150,y-i*15,150,y-300-i*15); line(170,y-i*15-50,170,y-350-i*15); line(130,y-i*15-50,170,y-i*15-50); line(150,y-300-i*15,190,y-300-i*15); line(x-150,i*15,x-150,300+i*15); line(x-170,i*15-50,x-170,250+i*15); line(x-150,i*15,x-190,i*15); line(x-130,250+i

5、*15,x-170,250+i*15); outtextxy(i*25,150,str); outtextxy(x-i*25,y-150,str); delay(5000); void graphtwo(char *str) int i; for(i=0;i30;i+) setcolor(5); cleardevice(); settextstyle(1,1,4); line(i*25,y-100,300+i*25,y-100); line(i*25,y-120,300+i*25,y-120); line(x-i*25,100,x-300-i*25,100); line(x-i*25,120,

6、x-300-i*25,120); outtextxy(150,i*25,str); outtextxy(x-150,y-i*25,str); delay(5000); void graphthree(char *str) int i,j,color,width; color=random(maxcolor); / 随机得到颜色值 setcolor(color); settextstyle(1,0,1); / 设置字符串的格式 outtextxy(x/2,y/2-100,str); / 显示字符串 delay(8000); for(i=0;i=0;i-) / 字符串由大变小 cleardevic

7、e(); / 清屏 settextstyle(1,0,i); outtextxy(x/2,y/2-i*10-100,str); outtextxy(x/2,y/2+i*10-100,str); width=textwidth(str); setlinestyle(0,0,1); line(x-width)/2+10*(8-i),y/2+i*15-70,(x+width)/2-10*(8-i),y/2+i*15-70); line(x-width)/2+5*(8-i),y/2+i*15-60,(x+width)/2-5*(8-i),y/2+i*15-60); line(x-width)/2,y/

8、2+i*15-50,(x+width)/2,y/2+i*15-50); line(x-width)/2,y/2+i*15-20,(x+width)/2,y/2+i*15-20); line(x-width)/2+5*(8-i),y/2+i*15-10,(x+width)/2-5*(8-i),y/2+i*15-10); line(x-width)/2+10*(8-i),y/2+i*15,(x+width)/2-10*(8-i),y/2+i*15); delay(8000); 程序中用到的库有 graphics.h,dos.h,和 stdlib.h,其中 graphics.h 中的图形库函 数,

9、除 initgraph(), cleardevice(), closegraph(), settextjustify(), settextstyle(), setlinestyle(), outtextxy(),setcolor(),line()外,还包括 1) getmaxx() 原型说明:void far getmaxx (void) 主要功能:返回当前图形模式下的最大有效的 x 值(即最大的横坐标) 2) getmaxy() 原型说明:void far getmaxy (void) 主要功能:返回当前图形模式下的最大有效的 y 值(即最大的纵坐标) 3) getmaxcolor() 原型

10、说明:void far getmaxcolor(void) 主要功能:返回当前图形模式下的最大有效的颜色值 4) textwidth() 原型说明:void far textwidth(char far *str) 主要功能:以象素为单位,返回由 str 所指向的字符串宽度,针对当前字符的字 体与大小。 该程序用到的 dos.h 中的库函数有 delay(),其原型说明为: void delay(unsigned milliseconds); 该函数将程序的执行暂停一段时间(毫秒) 该程序用到的有 stdlib.h 的库函数 random()random(),其原型说明为: void far

11、random(int num) 此函数返回一个 0-num 范围内的随机数。 利用动态开辟图视口的方法 在 3.2.1.7 节介绍了图视口的操作函数,这样我们可以利用图视口设置技术,可 以实现图视口动画效果,例如可在不同图视口中设置同样的图象,而让图视口沿 x 轴方向移动设置, 这次出现前要清除上次图视口的内容, 这样就会出现图象沿 x 轴移 动的效果。 也就是说, 在位置动态变化, 但大小不变的图视口中(用 setviewpot()函数), 设置固定图形(也可是微小变化的图象),这样虽呈现在观察者面前的是当前图视口位 置在动态变化,但视觉上却象是看到图象在屏幕上动态变化一样。 例程 3-29

12、 就是这样做的,不断的沿 x 轴开辟图视窗口,就像一个大小一样的窗 口沿 x 轴在移动, 由于总有 clearviewport 函数清除上次窗口的相同立方体, 因而视觉 效果上, 就像一个立方体从左向右移动一样。 程序中定义的 movebar 函数作用是开辟 一个图视窗口,并画一个填色的立方体,保留一阵(delay(250000))然后清除它,主 程序不断调用它, 因每次顶点 x 坐标在增加, 因而效果是立方体沿 x 轴从左向右在运 动。 /*例程 3-29*/ #include #include main() int i,graphdriver,graphmode; graphdriver=

13、DETECT; initgraph( for(i=0;i25;i+) setfillstyle(1,i); movebar(i * 20); closegraph(); movebar(int xorig) /* 设窗口并画填色小立方体 */ setviewport(xorig,0,639,199,1); setcolor(5); bar3d(10,120,60,150,40,1); floodfill(70,130,5); floodfill(30,110,5); delay(250000); clearviewport(); 采用上面的两种方法对较复杂图形不宜, 一则画图形要占较长时间,

14、二则图视口 位置切换的时间就变得较长,因而动画效果就会变差。 利用屏幕图象存储再放的方法 在图形方式下,与文本方式类似,除了清屏函数 cleardevice()外,还有其它的对 屏幕图象操作的函数,其中一类是屏幕图象存储和显示函数,包括: 1) 存屏幕图象到内存区 void far getimage(int x1,int y1,int x2,int y2,void far *bitmap); 该函数将把屏幕左上角为(x1,y1),右下角为(x2,y2)矩形区内的图象保存到指 针 bitmap 指向的内存区去。为了能开辟一个内存缓冲区,使它恰能存下所指矩形区 中的图象, 则必须首先要知道所存图象

15、占多少字节, 则内存缓冲区也可设这样多的字 节,这可用下面的函数: 2)测定图象所占字节数的函数 unsigned far imagesize(int x1,int y1,int x2,int y2); 该函数将得到屏幕上左上角为(x1,y1),右下角为(x2,y2)矩形区内图象所占的 字节数。 3) 3) 将所存图象显示的函数 void far putimage(int x1,int y1,void far *bitmap,int op); 该函数将把指针 bitmap 指向的内存区中所装图象,与屏上现有左上角为(xl,y1) 的矩形区内图象进行 op 规定的操作(参见表 3-16) 。该函

16、数进行各种图象的逻辑操 作如同二进制操作一样。 表表 3-16 op 规定值及操作规定值及操作 符号名 值 含义 COPY_PUT 0 复制 XOR_PUT 1 进 行 异 或操作 OR_PUT 2 进 行 或 操作 AND_PUT 3 进 行 与 操作 NOT_PUT 4 进 行 非 操作 例程 3-30 演示了表 3-16 中的逻辑操作,for 循环用来在屏上方产生连续的五个 方框,方框中套一用洋红色(5)填充的小方块,五个图象全一样。循环结束后,又 在屏下方画出两个框,小框用洋红色填充并在大框内。程序运行后,立即在屏上显示 出上述图案,当按任一键后,则由函数 imagesize 得到屏下方大框套一填充框区

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号