3、天空中运行的卫星
动画显示中最基本和常用的技术是位图像操作,它可以把屏幕上一个矩形区域的图形复制到缓冲区中,也可以从缓冲区中将位块取出重现在屏幕上。目标图像的擦除最简单的方法是采用XOR(异或方式,即将目标中的每个像素点和屏幕上相应的像素点作XOR运算,使目标变得可见,为了擦掉这一目标 ,只需简单地再将它与屏幕XOR一次,背景中被目标所遮盖的部分又可以还原成原来的状态。
我们也可以利用AND和XOR运算,对被移动的目标事先作好两个非凡的掩模(mask),我们称为AND掩模和XOR掩模,这两个掩模的图形制作方式是不同的,AND掩模要求目标轮廓内位图像各点像素值为0,而XOR掩模应按目标的实际颜色去做,并将这两个掩模保存到缓冲区中去。当一个目标在背景移动时,先将目标的AND掩模与屏幕相“与”,其结果在背景当前位置产生一个像素值为0的目标轮廓洞,然后再用目标的XOR掩模与AND掩模相异或,这两个掩模经混合后,目标以其正常的颜色出现在屏幕上。这样通过采用目标位图的双掩模混合技术,当移动目标经过背景时,就不会出现目标颜色发生变化的情况。
作为一个示例,程序运行后,在屏幕上出现繁星闪烁的星际空间,由经纬线组成的地球镶嵌在太空中,一颗卫星缓缓从屏幕中飞过,同时在屏幕上写出彩色大汉字“星际卫星运动轨迹”和“欢迎你使用该系统”,整个画面生动美观。
/*天空中运行的卫星Qw43.C*/
#include<graphics.h>
#include<alloc.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define STEP 5
#define DELAY 150
#define SIZE 25
#define YELLOW 14
#define RED 4
void *xormask,*andmask,*covered;
void draw_earth();
void get_mask(int,int,int,int);
void putstar(void);
void xshz();
int main()
{
int gmode=VGAHI,gdriver=VGA,midx,i,cx=1,cy;
char *j1,*j2,*j3,*j4;
initgraph(&gdriver,&gmode,"\\tc3\\bgi");
cy=getmaxy()/2;
covered=malloc(imagesize(cx,cy,cx+SIZE,cy+SIZE));
xormask=malloc(imagesize(cx,cy,cx+SIZE,cy+SIZE));
andmask=malloc(imagesize(cx,cy,cx+SIZE,cy+SIZE));
getimage(cx,cy,cx+SIZE,cy+SIZE,covered);
setfillstyle(SOLID_FILL,getmaxcolor());
bar(cx,cy,cx+SIZE,cy+SIZE);
get_mask(cx,cy+15,0,0);
getimage(cx,cy,cx+SIZE,cy+SIZE,andmask);
putimage(cx,cy,covered,COPY_PUT);
get_mask(cx,cy+15,YELLOW,RED);
getimage(cx,cy,cx+SIZE,cy+SIZE,xormask);
putimage(cx,cy,xormask,XOR_PUT);
draw_earth();
putstar();
j1="星际卫星运动轨迹";
j2="欢迎您使用该系统";
j3="地";
j4="球";
/*因为没有HZK24,所以下面一段显示汉字的程序没有调试*/
/* xshz(j1,100,10,1,1,15,1,"k",10);
xshz(j2,100,400,1,1,2,0,"s",10);
xshz(j3,310,200,0,0,14,0,"s",1);
xshz(j4,310,240,0,0,14,0,"s",1);
*/
for(i=0;i<600;i+=STEP){
putimage(cx+i,cy,covered,COPY_PUT);
getimage(cx+STEP+i,cy,cx+SIZE+STEP+i,cy+SIZE,covered);
putimage(cx+STEP+i,cy,andmask,AND_PUT);
putimage(cx+STEP+i,cy,xormask,XOR_PUT);
delay(DELAY);
}
getch();
closegraph();
return 0;
}
void get_mask(x,y,color1,color2)
{
moveto(x+10,y);
setcolor(color1);
linerel(-3*3,2*4);
moveto(x+10,y);
linerel(-3*3,-2*4);
moveto(x+25,y);
linerel(-5*5,0);
setfillstyle(1,color2);
fillellipse(x+13,y,8,8);
}
void putstar(void)
{
int seed=1993;
int i,dotx,doty,h,w,color,maxcolor;
maxcolor=getmaxcolor();
w=getmaxx();
h=getmaxy();
srand(seed);
for(i=0;i<5000;++i)
{
dotx=1+random(w-1);
doty=1+random(h-1);
color=random(maxcolor);
putpixel(dotx,doty,color);
}
srand(seed);
}
void draw_earth()
{
int midx, midy,i;
midx=getmaxx()/2;
midy=getmaxy()/2;
setbkcolor(BLACK);
setcolor(CYAN);
for(i=0;i<=13;i++){
ellipse(midx,midy,0,360,100,100-8*i);
ellipse(midx,midy,0,360,100-8*i,100);
}
setcolor(RED);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
ellipse(midx,midy,130,50,160,30);
}
/*汉字显示函数*/
void xshz(unsigned char *hzc,int ql,int qh,int lf,int hf,int qj,int bj,char zt[],int zj)
{
FILE *fp;
register int i,j;
unsigned char qu,wei;
int lo,k,qql,qqh;
char zkn[]="d:\\ucdos\\hzk24";
char hzbp[72];
if((fp=fopen(strcat(zkn,zt),"rb"))==NULL)
{ puts("file cannot open! \n"); exit(1); }
qqh=qh;
qql=ql;
while(*hzc) /*显示汉字串*/
{
qu=(*hzc-0xa1)&0x07f;
wei=(*(++hzc)-0xa1)&0x07f;
lo=(qu-15)*94+wei;
hzc++;
if(fseek(fp,lo*72L,SEEK_SET))
{ puts("file seek error! \n"); exit(1); }
if(fread(hzbp,1,72,fp)!=72)
{ puts("file read error! \n");exit(1); }
/*显示一个汉字*/
for(i=0;i<24;i++)
for(j=0;j<3;j++)
for(k=0;k<8;k++) /*显示一个字节*/
{
if((hzbp[i*3+j]>>(8-k))&1)
setfillstyle(SOLID_FILL,qj);
else
setfillstyle(SOLID_FILL,bj);
bar(qql,qqh,qql+lf,qqh+hf);
qqh=qh+(j*8+k)*(hf+1);
qql=ql+i*(lf+1);
}
ql=qql+zj;
}
fclose(fp);
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |