位图创建的火焰效果






4.03/5 (15投票s)
向您展示如何制作简单的火焰效果

引言
模拟火焰效果非常困难,所以我希望找到一种简单的方法,通过位图来实现模拟火焰效果。
背景
熟悉 DIB API 需要花费很长时间。位图和调色板是 GDI 子系统中最有用,同时也最容易让新手感到困惑的部分。
原理
这是一个简单的应用程序,效果也不是很好。我只是想找到一种更好的实现方式。关于这个演示程序,我不想花费太多时间。所以,抱歉大家。现在我将对这个应用程序进行简短的分析。
这个演示程序的主要思路是修改位图的位。
首先,我在底部绘制了两条线。抱歉我使用了太多的数字 - 这对我来说很容易,我是一个热爱数字的特别的人。
for(i=0;i<WIDTHBYTES(300)*7+20;i++)
for(j=0;j<2;j++)
{
setPixel(pBits,i,j,RGB(255,max(rand()%200,80),0));
setPixel(pBits,i,j,RGB(255,max(rand()%200,195),0));
}
正如我们所见,红色 (RED) 的颜色由 rand()%255
赋值,所以它的范围在 0~255 之间。为了创建更多的红色点,我们还需要在像素被随机数创建时创建黄色点(我的意思是黄色像素)。接下来,我们希望像素向上移动。从底部到顶部。请看代码片段
for(i=0;i<300;i+=2)
{
for(j=rand()%300;j>1;j-=1)
setPixel(pBits,i,j,getPixel(pBits,i,j-1));
}
由于火焰大小是固定的,我再次使用了数字。“300”表示位图的高度是 300 像素。为了确保每个像素具有不同的高度,这里也使用了随机数。“j=rand()%300)
”将在 0~300 之间创建一个 j
的值。
像素现在可以从底部到顶部了。但是它不会褪色。我们该怎么做呢?当然,减少每个像素的值。FadeColor()
就是用来做这个的。
void FadeColor(BYTE *pBits,int x,int y)
{
pBits[y*300*3+x*3]=max(pBits[y*300*3+x*3]-6,0);
pBits[y*300*3+x*3+1]=max(pBits[y*300*3+x*3+1]-6,0);
pBits[y*300*3+x*3+2]=max(pBits[y*300*3+x*3+2]-3,0);
}
数字“3”表示位图的位计数是 24。(24/8=3)。每次减少 RGB 值的 6,这样就会创建一个渐变。太简单了!!
想了解更多吗?请下载源代码。我有很多事情要做。考虑到时间,我不能写太多。感谢大家的支持!!!真的!希望成为你的朋友!希望你能投出好评!
历史
- 2009 年 12 月 26 日:初始发布