设为首页   加入最爱           最新更新:全方位英文文章资料库
 
资料坊搜索: 标题 全文     
多重透明无闪烁微机动画设计
   首页>>YesizeCOM>>论文坊>>农医学类>>正文       
 
广告招租,e-mail:yesize@hotmail.com

广告招租,e-mail:yesize@hotmail.com

摘 要 该文阐述了一种利用EGA/VGA上的位页面结构及彩色调色板来开发一个可以处理数个快速图像重叠及优美画面质量的动画结构。利用这种技术不仅会产生多重透明图像效应,而且可用最快的速度画图。 
动画设计一直是微型计算机编程人员的热门话题,有不少编程人员利用C语言系列中的gentimage()和putimage()函数,在屏幕上不断画、擦,产生动画效果。这样产生的动画有较强的闪烁感,而且动画只能在一致的背景颜色下产生。有些同志采用直接视屏缓冲区读、写,这对16色的640×480色图像,要同时处理分散在4个彩色页面中的图像,既复杂又费时,而且当图像相交时很难避免相互影响的问题,因为这些部分在缓冲区中占用了相同的位。 
由于EGA/VGA的4个页面可单独被读出及写入,如果将图像存于单一页面,这样就可以免去EGA/VGA中处理分散于各页面中图像的烦人问题。可以很容易处理4组图像,而且在不同页面中的图像不会互相干扰,但这样也产生了另一个问题:由于不同页面中位的混合产生了新的色彩,相交部分看起来并不属于任何图像。我们所希望的是一个图在另一个图的前面,并且由前图可以看到后图的透明色。 
通过修改彩色调色板的值,完全可以达到上述效果。 
实际上,来自各页面4位混合的点的颜色是由这4位所指的调色板值决定的。假设该点是从4色中选一色,而不是从16色中选一色,如果由彩色页面0来的位为1,则选择色彩0。 
如果由彩色页面1来的位为1,则选择色彩1。如果由彩色页面2来的位为1,则选择色彩2。如果由彩色页面3来的位为1,则选择色彩3。当不止一个位为1时,只来自最小号码页面的位决定颜色,其它页面的位则忽略不用。若每个位均为0,则选择背景颜色。我们所做的就是重新控制调色板寄存器使得来自最高次序页面且值为1的位有色彩决定权。附表列出了上述调色板值的设置。 
这样我们将可以得到4个颜色及一个背景色,而且也会定出一个简单的图像次序,页面0中的图像在其它页面之前,页面1中的图像在页面2、3图像之前,依此类推,而且还有一种透明性,可以由前面图像的缺口或边缘看到背后图像。最重要的是这符合不同图像存于不同页面的标准,可以快速处理图像,从而消除动画闪烁的感觉。 
下面的程序说明位页面的动画,它是利用WPS中SPT产生几幅.SPT图像,分别装入不同位面,修改调色板值产生的重叠透明的动画效果。读者可以看到在前景(中文字幕)不动的情形下,背景(一幅较大的太空夜图)缓缓移动,给人一种全新的动画感觉。 
@@T5S12900.GIF;附表调色板值设置@@ 
其实,只要对上面的想法稍作改进,便能产生更好效果的动画。我们可以只用一、二个页面来作动画,空出其它的页面处理色彩问题。例如:利用彩色页面3作动画,而用彩色页面0、1、2来提供8种色彩的图像。读者不妨亲自设计一下调色板的值。 
#include<stdio.h> 
#include<process.h> 
#include<alloc.h> 
#include<mem.h> 
#include<graphics.h> 
#include<dos.h> 
#include<conio.h> 
typedef enum { 
RIGHT , 
LEFT , 
UP , 
DOWN 
} dir-move; 
int mov-spt 
( unsigned char *filename , 
dir-move dir , 
int startx , 
int starty , 
int page , 
int forg ); 
void main() 

FILE *fp&nbs p;; 
struct palettetype pal,pall ; 
unsigned char name[30] ; 
int i,gdriver=DETECT, gmode, errorcode ; 
initgraph(&gdriver, &gmode, " "); 
errorcode=graphresult(); 
if (errorcode !=gr0k) /* an error occurred */ 

printf(" Graphics error: %s\n",grapherrormsg(errorcode)); 
printf(" press any key to halt :"); 
getch(); 
exit(1); /* return with error code */ 

getpalette(&pal); 
pall.size=16; 
for (i=0;i<16;i++) 
pall.colors[i]=LIGHTBLUE; 
setallpalette(&pall); 
move-spt("f2.spt",UP,0,0,1,RED); 
move-spt("f3.spt",DOWN,0,0,2,YELLOW); 
move-spt("f4.spt",LEFT,0,0,3,BLUE); 
move-spt("f5.spt",RIGHT,0,0,4,7); 
getch(); 
setallpalette(&pal); 
outpw(0x3c4,0x0f02); 
closegraph(); 

int move-spt 
( unsigned char *filename , 
dir-move dir , 
int startx , 
int starty , 
int page , 
int forg ) 

int i,j,wid,hei,row,col,tmp ; 
int offset,offset1 ; 
struct palettetype pal,pall ; 
unsigned char buffer[200],bit-page ; 
unsigned char far *video ; 
unsigned char far *mirror ; 
FILE *fp ; 
if((fp=fopen(filename, "rb"))==NULL) 

printf("Cannot open file %s.\n", file name); 
exit (1); 

bit-page=(0x01<<((page-1)%4)); 
pall.size=16; 
getpalette(&pal); 
for (i=0;i<16;i++) 

if (i&bit-page) 
pall.colors[i]=forg;< 

BR>else 
pall.colors[i]=pal.colors[i]; 

setallpalette(&pall); 
if((mirror=(unsigned char far *)farmalloc(sizeof(unsigned char) *384001))==NULL) 

printf("Memory allocation error!\n"); 
exit(1); 

memset(mirror,0,384001); 
fseek (fp,341,SEEK-SET); 
fread (&wid,sizeof(int),1,fp); 
fread (&hei,sizeof(int),1,fp); 
if(wid>640||(hei>480)) 

printf("Sorry. Image too large.\n"); 
exit(1); 

fseek(fp,641,SEEK-SET); 
if((startx+wid)>640)startx=640-wid; 
if((starty+hei)>480)starty=480-hei; 
for (i=0;i<hei;i++) 

offset=(i+starty)*80+startx/8; 
fread(buffer,sizeof(unsigned char);wid/8,fp); 
for (j=0;j<wid/8;j++) 
buffer[j]=buffer[j]^0xff; 
movmem(buffer,(mirror+offset),wid/8); 

outp(0x3c4,0x02); 
outp(0x3c5,bit-page); 
switch(dir) 

case RIGHT; 
for(col=0;col<640;col+=2) 

tmp=(640-col)/8; 
for(i=0;i<480;i++) 

offset=i*80; 
offset=i*80+tmp; 
vodeo=(unsigned char far *)MK-FP(0xa000,offset1); 
movmem((mirror+offset),video,(col)/8); 


break; 
case LEFT; 
for (col=639;col>=0;col-=3) 

for(i=0;i<480;i++) 

offset1=(col+7)/8 +i*80; 
offset=i*80; 
video=(unsigned char far *)MK-FP(0xa000,offset1); 
movmem((void *)(mirror+offset),(void *)video,(640-col)/8); 


break; 
case UP; 
for (row=479;row>=0;row-=1) 

for(i=0;i<480-row;i++) 

offset1=row*80; 
offset=(479-row)*80; 
video=(unsigned char far *)MK-FP(0xa000,offset1); 
movmem((mirror+offset),video,80); 


break; 
case DOWN: 
for (row=0;row<480;row+=1) 

for(i=0;i<row+;i++) 

offset1=row*80; 
offset=offset1; 
movmem((mirror+offset),(video+offset1),80); 


break; 

farfree(mirror); 
fclose(fp); 
return(0); 

上一篇:在16色模式下显示256色及全彩色 下一篇:FLIC动画文件的播放程序设计

版权说明:作品来源于网上,版权归作者所有,如果无意中侵犯了您的版权,请来信告知,本站将在3个工作日内删除。yesize@hotmail.com
  热门小游戏分类 
射击小游戏 连连看小游戏
台球小游戏 成人小游戏
CS小游戏 化妆小游戏
赛车小游戏 休闲小游戏
篮球小游戏 换装小游戏
儿童小游戏 牛牛小游戏
麻将小游戏 冒险小游戏
美媚小游戏 益智小游戏
体育小游戏  
Society Recreation & Sports
Travel & Leisure Communications
Vehicles Computers
Fashion Arts & Entertainment
Reference & Education Disease & Illness
Writing & Speaking Politics
Product Reviews Food & Beverage
Finance Internet Business
Self Improvement Home & Family
Health & Fitness Business
最新更新内容
警惕“公务员报考热”背
公务员考试不是丈母娘考
一名新公务员的自白:我
公务员考脑筋急转弯与挂
北努斗:2006行政能力测
大讨论:06行测BT题目大
过来人回忆:当年,我也
一家之言:公务员热折射
公务员考试申论要是有正
数十万大学生走进公务员
      粤ICP备05005424         Copyright ©2000 - 2004 Yesize.COM