• 当前位置:首页>>C语言>>C语言编程实例>>图形与动画-02
  • 图形与动画-02

  • 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);
    }

    [1] [2] 下一页