午夜亚洲国产日本电影一区二区三区,九九久久99综合一区二区,国产一级毛片视频,草莓视频在线观看精品最新

加急見刊

多重透明無閃爍微機動畫設計

徐超

摘 要 該文闡述了一種利用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 #include #include #include #include #include #include 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=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 ) {

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=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

下載