當前位置:編程學習大全網 - 源碼下載 - 橫軸源代碼

橫軸源代碼

c類火焰程序//煙火程序

{

公共:

CFireRoutine();//構造函數

virtual ~ CFireRoutine();//虛擬狀態的析構函數

// Functs(公共)

void init fire();//初始化

void ClrHotSpots();//清除燃燒點

void InitPallette();//初始化調色板

void set hotspots();//設置燃點

void MakeLines();//生成掃描線

//呈現(視頻內存、寬度、高度)

void Render(DWORD * pvideomememory,

int iwidth,

int iheight);

//均值(在x,y點)(像素均值?)

無符號字符平均值(int x,int y);

//道具

int m _ iFlameHeight//火焰高度

int m _ iWidth//寬度

int m _ iHeight//Height(應該是繪圖區域的高度)

//火焰的來源,也就是離著火點的Y坐標。

int m _ iFireSource//發光點的y位置

int m _ iFireChance//燃燒概率

int m _ iAvgFlameWidth//平均火焰寬度

int m _ iAlpha//α(深度)

COLORREF m _ fire colors[4];//火焰顏色

BYTE * m _ pFireBits//火焰數據

DWORD m _ pPalletteBuffer[256];//調色板

long * m _ pYIndexes//顏色索引

};

//熔化漿料:

CPlasmaRoutine類

{

公共:

CPlasmaRoutine();//構造函數

virtual ~ CPlasmaRoutine();//虛擬析構函數

//方法

void SetDefaultValues(VARIANT * pExtParms);//設置默認參數值(外部變量)

void initialize plasma(VARIANT * pExtParms);//初始化magma參數

void Create(int iWidth,int I height);//根據視圖生成巖漿

Void Render(DWORD* pBits,//根據像素位置、視圖寬度、高度和掃描線進行渲染。

int iwidth,

身高,

int iline length);

//設置顏色索引的RGB值。

void SetRGB(int iIndex,int R,int G,int B);

void InitCostBLTable();//初始化磨損平衡表?BL是平衡的意思嗎?不知道,不是對比度和亮度,是色彩飽和度。好像都沒有。

void InitPallette();//初始化調色板

void calc plasma();//計算巖漿

//按顏色開始,按顏色結束,按顏色步長創建漸變顏色,存入緩沖區。

void create gradient(COLORREF clr start,COLORREF clrEnd,long lSteps,COLORREF * p buffer);

//道具

int m _ iWidth//視圖寬度

int m _ iHeight//視圖高度

int m _ iAlpha//查看深度

BYTE * m _ pPlasmaBits//magma序列緩沖區

DWORD m _ pPalletteBuffer[256];//調色板

int m _ icost bl[256];//損失余額表

COLORREF m _ plasma colors[16];//yep16生成調色板所需的顏色...16種顏色用於生成調色板。

//下面應該是用於曲線擬合的貝塞爾曲線的四個控制點和矢量坐標。

無符號字符m_a1,m_a2,m_a3,m_a4,m_b1,m_b2,m_b3,m _ b4

int m _ imodifier 1;

int m _ iModifier2

int m _ iModifier3

int m _ iModifier4

//雙向修改器(兩點拉動形成的向量)

int m _ ixmodifier 1;

int m _ iXModifier2

int m _ iy modifier 1;

int m _ iYModifier2

};

//fire routine . CPP:cfire routine類的實現。

//

//////////////////////////////////////////////////////////////////////

#包含" stdafx.h "

#包含“FireRoutine.h”

#ifdef _DEBUG

#undef THIS_FILE

static char THIS _ FILE[]= _ _ FILE _ _;

#定義新的DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

//構造/銷毀構造函數,初始化所有參數。註意火源初始值為2,燃燒概率初始值為10。

//////////////////////////////////////////////////////////////////////

CFireRoutine::CFireRoutine()

{

m _ I width = 0;

m _ iHeight = 0;

m _ pFireBits = NULL

m _ pYIndexes = NULL

m _ ifi resource = 2;

m _ ifirecharce = 10;

m _ iFlameHeight = 50

m _ iAlpha = 255

m_FireColors[0] = RGB(0,0,0);//黑色

m_FireColors[1] = RGB(255,0,0);//紅色

m_FireColors[2] = RGB(255,255,0);//黃色

m_FireColors[3] = RGB(255,255,255);//白色

m _ iAvgFlameWidth = 35

}

//析構函數,如果顏色索引和渲染緩沖區存在,則註銷。

CFireRoutine::~CFireRoutine()

{

if(m_pFireBits!=空)

delete[]m _ pFireBits;

if(m_pYIndexes!=空)

刪除[]m _ py indexes;

m _ pFireBits = NULL

m _ pYIndexes = NULL

}

void CFireRoutine::InitFire()

{

//去掉那裏準備好的任何東西初始化火焰,如果有顏色索引和渲染緩沖,先註銷。

if(m_pFireBits!=空)

delete[]m _ pFireBits;

if(m_pYIndexes!=空)

刪除[]m _ py indexes;

//高度加三自動加三。

m _ ih height+= 3;

m _ py indexes = new long[m _ iHeight];//顏色索引時以火焰高度為長度的長整型數組。

m_pFireBits =新字節[m _ I width * m _ I height];//渲染緩沖區是壹個長度為w * h的字符數組。

//清除Fire位將火焰緩沖設置為零。

memset(m_pFireBits,0,(m _ I width * m _ I height));

//進行所有y索引的預先計算...在計算之前,將顏色緩沖值初始化為每個元素=寬度*高度。

for(int y = m _ iHeight;y & gt0;y -)

m _ py indexes[y]= y * m _ I width;

//創建我們的調色板

InitPallette();//初始化調色板

ClrHotSpots();//清除燃燒點

}

//清除燃點意味著清除渲染緩沖區中的壹行。是什麽線?就是顏色索引裏火源指向的那條線。

void CFireRoutine::ClrHotSpots()

{

//清除火線

memset(& amp;m _ pFireBits[m _ py indexes[m _ ifi resource]],0,m _ I width);

}

//初始化調色板。您可能需要首先理解調色板的概念:雖然圖片可能是彩色的,但是如果每個像素

//都是用三個字節的RGB存儲的,所以成本太高。調色板是基於這張圖片還是彩色圖片的假設,但是經過色彩分析,

//圖片中常用的顏色只有256種,所以壹個字節可以代表壹個像素,但是這個字節的值指的是

//不是RGB的顏色矢量,而是256色的代碼,是這張圖的調色板。

void CFireRoutine::InitPallette()

{

//在火的所有顏色之間創建漸變...用來為我們的火焰創建過渡顏色的所有顏色。

long iCount = 0;

COLORREF clrStart

COLORREF clrEnd

for(int iColor = 1;iColor & lt4;IColor++) //火焰的四種顏色定義

{

clr start = m _ fire colors[iColor-1];//設置過渡顏色的起始顏色。

clrEnd = m _ fire colors[iColor];//設置過渡顏色的結束顏色。

int r,g,b;//先距離,再起始值先計算距離,再計算值。

浮點rStep、gStep、bStep//每種顏色的步長//每種顏色的過渡步長值。

//獲取色差得到三種顏色RGB的初始色和過渡色差。

r =(getr value(clrEnd)-getr value(clr start));

g =(GetGValue(clrEnd)-GetGValue(clr start));

b =(getb value(clrEnd)-getb value(clr start));

int nSteps = max(abs(r),max(abs(g),ABS(b)));//過渡步數是RGB、紅綠藍中色差最大的壹個。

float f step =(float)(255/3)/(float)n steps;//將色差步長值轉換為浮點數。

//計算每種顏色的步長

rStep = r/(float)ns teps;//求每個顏色分量的色差步長值。

gStep = g/(float)ns teps;

bStep = b/(float)ns teps;

//將顏色重置到起始位置將顏色設置為漸進顏色的初始顏色。

r = getr value(clr start);

g = GetGValue(clr start);

b = getb value(clr start);

for(int iOnBand = 0;iOnBand & ltnStepsIOnBand++) //根據RGB計算每種顏色在整個漸變中的實際值。

{

//COLORREF color = RGB(r+rStep * ion band,g + gStep*iOnBand,b+bStep * ion band);

COLORREF color = RGB(b+bStep * ion band,g + gStep*iOnBand,r+rStep * ion band);

long lIndex =(int)(ion band * f step);

if(lIndex+((iColor-1)* 85)& lt;255)

m _ pPalletteBuffer[lIndex+((iColor-1)* 85)]= color;//將計算結果放入調色板。

}

}

//稍微踩壹下第二種顏色...過渡到結束色,後面顏色生成的內容基本和上面壹樣。

clr start = m _ fire colors[0];

clrEnd = m _ fire colors[1];

for(int kj = 0;kj & ltm _ iFlameHeightkj++)

m _ pPalletteBuffer[kj]= 0;

int r,g,b;//首先是距離,然後是起始值

浮點rStep、gStep、bStep//每種顏色的步長

//獲取顏色差異

r =(getr value(clrEnd)-getr value(clr start));

g =(GetGValue(clrEnd)-GetGValue(clr start));

b =(getb value(clrEnd)-getb value(clr start));

int nSteps = max(abs(r),max(abs(g),ABS(b)));

float f step =(float)(85-m _ iFlameHeight)/(float)n steps;

//計算每種顏色的步長

rStep = r/(float)ns teps;

gStep = g/(float)ns teps;

bStep = b/(float)ns teps;

//將顏色重置到起始位置

r = getr value(clr start);

g = GetGValue(clr start);

b = getb value(clr start);

for(int iOnBand = 0;iOnBand & ltnStepsiOnBand++)

{

//COLORREF color = RGB(r+rStep * ion band,g + gStep*iOnBand,b+bStep * ion band);

COLORREF color = RGB(b+bStep * ion band,g + gStep*iOnBand,r+rStep * ion band);

long lIndex =(int)(ion band * f step);

m _ pPalletteBuffer[lIndex+(85-m _ iFlameHeight)]= color;//填入顏色值

}

}

//獲取指定範圍內的隨機整數的宏*/這是壹個根據範圍取隨機數的宏。

#define getrandom( min,max)((rand()%(int)(((max)+1)-(min))+(min))

# include & lttime.h & gt

Voidcfire例程::Set hotspots()//設置燃點。

{

ClrHotSpots();//首先明確燃點。

//m_iAvgFlameWidth

long l position = 0;//根據橫軸位置累加,直到達到寬度限制。

while(l position & lt;m_iWidth)

{

//看看我們是否應該做壹個火焰

if (getrandom(0,100)& lt;m _ ifirecharce)//取壹個隨機數,看是否在燃燒概率範圍內。如果沒有,跳過它。

{

//獲取火焰寬度

long lflame width = get random(1,m _ iAvgFlameWidth);//隨機獲取壹個火焰寬度。

for(int I = 0;我& ltlFlameWidthi++)

{

if(l position & lt;M_iWidth) //如果位置在屏幕內,設置壹個燃點。

{

m _ pFireBits[m _ py indexes[m _ ifi resource]+lPosition]= 254;//設置熱點!

l position++;

}

}

}

l position++;

}

//for(x = 0;x & ltm _ iWidthx++)

// {

// if (getrandom(0,100)& lt;m _充電)

// {

// }

// }

}

Voidcfiire例程::make lines()//生成渲染的掃描線。

{

int x,y;

for(x = 0;x & ltm _ iWidthX++) //水平循環,從屏幕的左到右。

{

for(y = m _ ifi resource;y & ltm _ ih height-1;Y++) //縱向環流,從火源到火焰高度

//for(y = m _ I height;y & gtm _ iFireSourcey -)

{

//m _ pFireBits[m _ py indexes[y-1]+x]= Average(x,y);

m _ pFireBits[m _ py indexes[y+1]+x]= Average(x,y);//火焰值是掃描線的平均值。

}

}

}

無符號char CFireRoutine::Average(int x,int y)

{

無符號字符ave _ color

無符號char ave1,ave2,ave3,ave4,ave5,ave6,ave7

//確保我們不在最後壹行...只要不是最後壹條掃描線,平均值計算如下。

if(y == m_iHeight)

ave 1 = m _ pFireBits[m _ py indexes[y-1]+x];

其他

ave 1 = m _ pFireBits[m _ py indexes[y+1]+x];

//掃描線條平均值的方法,取壹個以X,Y為圓心,小半徑1,大半徑2的橫向橢圓,從這個範圍內獲取顏色,然後計算平均值:

//基本上就是下圖的樣式:格式:取點號(坐標)

/*

1#(x,y+1)

6#(x-2,y) 4#(x-1,y) 7#(x,y) 3#(x+1,y) 5#(x+2,y)

2#(x,y-1)

*/

ave 2 = m _ pFireBits[m _ py indexes[y-1]+x];

ave 3 = m _ pFireBits[m _ py indexes[y]+x+1];

ave 4 = m _ pFireBits[m _ py indexes[y]+x-1];

ave 5 = m _ pFireBits[m _ py indexes[y]+x+2];

ave 6 = m _ pFireBits[m _ py indexes[y]+x-2];

ave 7 = m _ pFireBits[m _ py indexes[y]+x];

ave _ color =(ave 1+ave 2+ave 3+ave 4+ave 5+ave 6+ave 7)/7;

//找到顏色平均值並返回。

return(ave _ color);

}

//根據顯存渲染。

void CFireRoutine::Render(DWORD * pvideomememory,

int iwidth,

內部高度

)

{

set hotspots();//生成隨機熱點生成燃燒點。

make lines();//進行所有的數學計算和屏幕更新//生成掃描線並更新屏幕。

//現在,我只是將塊傳輸到視頻內存//對視頻內存進行BitBlt緩沖復制。

無符號char * pSrcBitlin//= m _ pFireBits+(m _ I width * 3);//除掉我們的火源//得到火源。

BYTE * dst//=(BYTE *)Dib-& gt;pVideoMemory內存;

字節r;

字節g;

字節b;

for(int I = 0;我& ltm _ ih height-3;I++) //漸進式掃描

{

dst =(字節*)& amp;pvideomememory[(I width * I)];//獲取視頻的當前行

pSrcBitlin = & ampm _ pFireBits[m _ py indexes[I+3]];//設置掃描線數據指針

for(int x = 0;x & ltm _ iWidthx++)

{

//合成色,註意索引色取RGB分量,然後加上深度和飽和度,然後偏移。

r = getr value(m _ pPalletteBuffer[pSrcBitlin[x]]);

g = GetGValue(m _ pPalletteBuffer[pSrcBitlin[x]]);

b = getb value(m _ pPalletteBuffer[pSrcBitlin[x]]);

dst[0]=(BYTE)(((r-dst[0])* m _ I alpha+(dst[0]& lt;& lt8))& gt;& gt8);

dst[1]=(BYTE)(((g-dst[1])* m _ I alpha+(dst[1]& lt;& lt8))& gt;& gt8);

dst[2]=(BYTE)(((b-dst[2])* m _ I alpha+(dst[2]& lt;& lt8))& gt;& gt8);

dst+= 4;

}

}

}

關於巖漿和水波的源碼,概念差不多。都是先建立顏色模型,然後匹配到緩沖區。仔細對比之後,我們就能理解它們了。

  • 上一篇:凡人修仙傳手遊戰鬥力怎麽提升 戰鬥力快速提升方法
  • 下一篇:誰知道(*(LPDWORD)(lpbi)) 指向的是lpbi中的哪壹成員變量
  • copyright 2024編程學習大全網