Vb中实现火焰效果

-zh1110

 

首先我们要建立一个调色盘

Public Pal(255) As PALETTEENTRY

Public Palette As DirectDrawPalette

 

然后建立一个与屏幕图象一样大小的数组Pict, 类型为字节,用来保存火焰每一个点时刻颜色数据,初始状态时各点都为0,(黑色)

Dim Pict() As Byte

 

因为要显示出火焰拖着一条尾巴的效果,需要对图象进行一些特殊的处理才行。Blur算法即是完成这个目的。(Blur,模糊的意思,)算法是取该象素下方,左方,右方 及上方两个象素的总值,然后除衰减值5,这样看上去象是火焰在向上蒸腾。

主要循环如下:

While Not ExitLoop

...

'锁住页面

DDSBack.Lock AlphaRect, DDSBackDesc, DDLOCK_WAIT, 0

'获得数组数据Pict

DDSBack.GetLockedArray Pict()

两边数值一直为0,目的使火焰向上蒸腾时两边产生向中间靠拢的效果,可免

For Y = 0 To 479

Pict(0, Y) = 0

Pict(639, Y) = 0

Next

'下方的火焰源头

For X = 0 To 639

Pict(X, 477) = Rnd * 220 + 35

Pict(X, 478) = Rnd * 220 + 35

Pict(X, 479) = Rnd * 220 + 35

Next

'Accum为当前象素数据(该象素下方,左方,右方 及上方两个象素的总值,然后除衰减值,衰减值取5左右才有较好火焰效果)

Accum = 0

For X = 1 To 638

For Y = 0 To 477

Accum = (Accum + Pict(X, Y + 1) _

+ Pict(X, Y + 2) _

+ Pict(X + 1, Y + 1) _

+ Pict(X - 1, Y + 1)) \ 5

'上下限0-255)

If Accum < 0 Then

Accum = 0

ElseIf Accum > 255 Then

Accum = 255

End If

Pict(X, Y) = Accum

Next

Next

'解锁

DDSBack.Unlock AlphaRect

文字的随机出现位置和时间间隔

If DX.TickCount() - lastTime > wait Then

If Counter = 0 Then

bDrawText = True

Counter = 1

XPos = Rnd * 200

YPos = 300 + Rnd * 140

wait = 400

ElseIf Counter = 1 Then

MsgIndex = MsgIndex + 1

If MsgIndex > 5 Then MsgIndex = 0

bDrawText = False

Counter = 0

wait = 2000

End If

lastTime = DX.TickCount

End If

'背景绘制文字

If bDrawText Then

On Error Resume Next

DDSBack.DrawText XPos, YPos, Msg(MsgIndex), False

On Error GoTo 0

End If

'绘制

MainForm.Form_Paint

Wend

 

文件下载