程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> 制作光牆效果

制作光牆效果

編輯:VC++

版權所有:Lythm
文章出處:東日制作室
轉載請與作者聯系

先給大家看看效果:



在學會光牆效果之前,首先要知道,最基本的(可能也是最經典的)火焰效果算法, 下面,我詳細說一下,很簡單當然,我所講的算法都是指實時運算的.

首先,看得出來,火焰有個共同點,底部是最亮的,頂部是最暗的,當中是一個過渡.怎麼才能在程序中很方便的顯示過渡色調呢?我的建議是建一個調色版,看到抓圖最頂部的那條由暗到亮的線條了嗎?那就是我在這個演示裡所用到的調色版.這樣在實時渲染的時候僅僅將調色版索引減1就可以達到從暗到亮的效果了.

這是我用的調色版生成的方法,你也可以自己做一個你所需要的,比如加上藍色火苗的顏色,灰的顏色...等等.

代碼大致如下:

WORD p[256]; //我用的是16bit色555模式

ZeroMemory(p,sizeof(p));

for(int i=0;i<64;++i)

{

p[i]=(i/2)<<10;

p[i+64]=0x7c00 | ((i/2)<<5&0x3e0);

p[i+128]=0x7c00 | 0x3e0 | ((i/2)&0x1f);

p[i+191]=0xffff;

}

然後定義一個用來運算的緩沖

char f[320][220]; //因為是對調色版索引進行計算,所以用char就夠了(如果你需要256以上顏色,char就不夠

//火焰的底部往往是最亮的所以在最底部加上燃料

for(int x=0;x
{

j=rand()*width/RAND_MAX;

block=rand()/RAND_MAX>0.5?255:0;

f[height-2][j]=block;

}

火星可以是很大一塊,或很小一塊,只要加上一個方陣就行了,這裡從簡,一個像素一個像素分別加

還可以加上一些粒子,這樣就像往火堆裡撒了一把木硝一樣

//從略

接著就開始生成火焰,從上往下渲染,先看源碼:

for(int y=0;y
for(int x=0;x
{

f[y][x]=(f[y+1][x]>0)?f[y+1][x]-1:0;

}

應該能看出點名堂了吧,因為越往上越暗,所以只要簡單的將下邊的像素索引值減1就成了當前像素的值 當然這只是基本的還不夠,火焰不是這麼精確的遞減的,你可以用簡單的模糊效果,比如取相鄰像素平均值渲染完把它話到屏幕上就行了,是不是很簡單:)

大致知道了火焰效果的實現後,做出光牆效果就簡單了,只要按火焰燃燒的方向生成就行了,也就是說從下到上

上面的代碼改成:

for(int y=height-2;y>0;--y)

for(int x=0;x
{

f[y][x]=(f[y+1][x]>0)?f[y+1][x]-1:0;

}

其實我只是為了說明一種方法,你可以用這種方法來制作其他的效果,充分發揮自己的想象力.另外不要以為現在已經進入高彩乃至真彩的時代就小看調色版技術,很多效果用調色版技術可以使編程更簡單,更直觀.

就這麼簡單,說完了.

lythm於2001,5,6凌晨

歡迎討論: [email protected]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved