论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

图形与动画-02

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:25


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

上一篇:{实例}图形与动画-01 人气:4651
下一篇:{实例}图形与动画-03 人气:5698
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058