关于百思特 信用说明 定制论文 发表论文 付款方式 常见问题 联系我们
网站地图 
加入收藏 
关于我们
首页  论文指导  教育论文  医学论文  英语论文  经济论文  管理论文  计算机论文  艺术论文  财会论文  理工论文
 论文格式  开题报告  论文答辩  论文撰写  论文发表
  您现在的位置:论文代写网首页 > 计算机论文

多重透明无闪烁微机动画设计

来源:百思特论文网     更新时间:2008-11-13      文字:[    ]

摘 要 该文阐述了一种利用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
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=0i<16i++)
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, filename)
exit (1)
}
bit-page=(0x01<<((page-1)%4))
pall.size=16
getpalette(&pal)
for (i=0i<16i++)
{
if (i&bit-page)
pall.colors[i]=forg<

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=0i<heii++)
{
offset=(i+starty)*80+startx/8
fread(buffer,sizeof(unsigned char)wid/8,fp)
for (j=0j<wid/8j++)
buffer[j]=buffer[j]^0xff
movmem(buffer,(mirror+offset),wid/8)
}
outp(0x3c4,0x02)
outp(0x3c5,bit-page)
switch(dir)
{
case RIGHT
for(col=0col<640col+=2)
{
tmp=(640-col)/8
for(i=0i<480i++)
{
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=639col>=0col-=3)
{
for(i=0i<480i++)
{
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=479row>=0row-=1)
{
for(i=0i<480-rowi++)
{
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=0row<480row+=1)
{
for(i=0i<row+;i++)
{
offset1=row*80
offset=offset1
movmem((mirror+offset),(video+offset1),80)
}
}
break
}
farfree(mirror)
fclose(fp)
return(0)
}


返回上一页  关闭窗口  打印页面   
 
  热点论文
·最新核心期刊列表(不断更新
·代写代发的职称论文套餐
·原创论文代写最低只要399元
·百思特论文网最新公告
·最强的博士论文代写团队
·硕士论文代写特色的服务
·论文格式排版说明--百思特论
·农村教育:现状、困难与对策
·百思特论文网保证原创版权归
·浅谈中医皮肤病治疗
  推荐论文
·住房保障政策的国际经验与借
·论税收权限划分状况对深化改
·探析小企业形象宣传三策略
·关于事业单位资产会计要素探
·浅谈单词拼写与能力培养的思
·关于民办学校小学英语教学特
·儒学思想对中华民族的巨大影
·论高等师范院校的体育教学
·关于恐怖电影的精神再分析
·浅谈建筑工程施工项目的报价

关于我们 - 付款方式 - 广告联系 - 联系我们 - 网站地图 - 网站声明 - 友情链接 - 帮助中心 -苏ICP备08017249号

咨询电话:025-83320151 13851808886 顾先生  客服QQ:点击这里给我发消息  点击这里给我发消息 Email:bestlunwen@vip.163.com

Copyright@2008-2009 www.bestlunwen.net All Rights Reserved.
  网络服务:京网互联