This was originally created for Darkbasic Pro and published in the TGC Newsletter
issue 46, section 13. The media downloads and other information is available in the Newsletter article.
I have translated for use with DarkGDK .NET. For those who use another .NET language, it can easily be translated. I placed all the necessary functions into a class that can be included into a project or made into a DLL. Hope some can find this helpful. Enjoy!
VB Code
Imports DGDKPlugins
Public Class explosions
'prepare the variables for the explosion system
'set the first object used by the system
Dim ex_first = 50000
'set the max number of objects the system can use
Dim ex_max = 50
'a counter to incerement throught he objects
Dim ex_counter = 0
'an array to determine if the object / explosion is alive
Dim ex_alive(ex_max)
'the curent frame of the explosion is held in an array
Dim ex_frame(ex_max)
'the first image number of the current explosion effect
Dim ex_first_image(ex_max)
'a frame skip delay to slow down the animation
Dim ex_delay(ex_max)
Public Sub split_image(ByVal baseImage As Integer, ByVal imgX As Integer, ByVal imgY As Integer, ByVal firstImg As Integer)
Dim baseSprite As Integer = 1
While CDarkGDK.oDBSprite.SpriteExist(baseSprite) = 1
baseSprite = baseSprite + 1
End While
Dim memNo = 1
While CDarkGDK.oDBMemBlock.MemblockExist(memNo) = 1
memNo = memNo + 1
End While
CDarkGDK.oDBMemBlock.MakeMemblockFromImage(memNo, baseImage)
Dim iW = (CDarkGDK.oDBMemBlock.MemblockDWORD(memNo, 0))
Dim iH = (CDarkGDK.oDBMemBlock.MemblockDWORD(memNo, 4))
Dim iD = (CDarkGDK.oDBMemBlock.MemblockDWORD(memNo, 8))
Dim imgWidth = iW / imgX
Dim imgHeight = iH / imgY
Dim mbSize = ((imgWidth * imgHeight) + 3) * 4
Dim memNo2 = memNo + 1
While CDarkGDK.oDBMemBlock.MemblockExist(memNo2) = 1
memNo2 = memNo2 + 1
End While
CDarkGDK.oDBMemBlock.MakeMemblock(memNo2, mbSize)
CDarkGDK.oDBMemBlock.WriteMemblockDWORD(memNo2, 0, imgWidth)
CDarkGDK.oDBMemBlock.WriteMemblockDWORD(memNo2, 4, imgHeight)
CDarkGDK.oDBMemBlock.WriteMemblockDWORD(memNo2, 8, iD)
For imagesY = 1 To imgY
For imagesX = 1 To imgX
Dim img = ((imagesY - 1) * imgX) + imagesX
Dim NewByte = 12
For rows = 1 To imgHeight
For cols = 1 To imgWidth
Dim offSet1 = (imagesY - 1) * imgWidth * imgHeight * imgX
Dim offset2 = (iW * (rows - 1))
Dim offset3 = imgWidth * (imagesX - 1)
Dim offset4 = cols - 1
Dim imgDword = (offSet1 + offset2 + offset3 + offset4 + 3) * 4
CDarkGDK.oDBMemBlock.WriteMemblockDWORD(memNo2, NewByte, CDarkGDK.oDBMemBlock.MemblockDWORD(memNo, imgDword))
NewByte = NewByte + 4
Next cols
Next rows
NewByte = 12
CDarkGDK.oDBMemBlock.MakeImageFromMemblock((img + firstImg - 1), memNo2)
Next imagesX
Next imagesY
CDarkGDK.oDBMemBlock.DeleteMemblock(memNo)
CDarkGDK.oDBMemBlock.DeleteMemblock(memNo2)
CDarkGDK.oDBSprite.DeleteSprite(baseSprite)
CDarkGDK.oDBImage.DeleteImage(baseImage)
End Sub
Public Sub prepare_explosions()
CDarkGDK.oDBImage.LoadImageB("media\expl01.png", 10, 1)
split_image(10, 6, 5, 50101)
CDarkGDK.oDBImage.LoadImageB("media\expl02.png", 10, 1)
split_image(10, 6, 5, 50201)
CDarkGDK.oDBImage.LoadImageB("media\expl03.png", 10, 1)
split_image(10, 6, 5, 50301)
CDarkGDK.oDBImage.LoadImageB("media\expl04.png", 10, 1)
split_image(10, 6, 5, 50401)
CDarkGDK.oDBImage.LoadImageB("media\expl05.png", 10, 1)
split_image(10, 6, 5, 50501)
CDarkGDK.oDBImage.LoadImageB("media\expl06.png", 10, 1)
split_image(10, 6, 5, 50601)
CDarkGDK.oDBImage.LoadImageB("media\expl07.png", 10, 1)
split_image(10, 6, 5, 50701)
CDarkGDK.oDBImage.LoadImageB("media\expl08.png", 10, 1)
split_image(10, 6, 5, 50801)
CDarkGDK.oDBImage.LoadImageB("media\expl09.png", 10, 1)
split_image(10, 6, 5, 50901)
CDarkGDK.oDBImage.LoadImageB("media\expl10.png", 10, 1)
split_image(10, 6, 5, 51001)
CDarkGDK.oDBImage.LoadImageB("media\expl11.png", 10, 1)
split_image(10, 6, 5, 51101)
CDarkGDK.oDBImage.LoadImageB("media\expl12.png", 10, 1)
split_image(10, 6, 5, 51201)
CDarkGDK.oDBImage.LoadImageB("media\expl13.png", 10, 1)
split_image(10, 6, 5, 51301)
CDarkGDK.oDBImage.LoadImageB("media\expl14.png", 10, 1)
split_image(10, 6, 5, 51401)
CDarkGDK.oDBImage.LoadImageB("media\expl15.png", 10, 1)
split_image(10, 6, 5, 51501)
CDarkGDK.oDBImage.LoadImageB("media\expl16.png", 10, 1)
split_image(10, 6, 5, 51601)
CDarkGDK.oDBImage.LoadImageB("media\expl17.png", 10, 1)
split_image(10, 6, 5, 51701)
CDarkGDK.oDBImage.LoadImageB("media\expl18.png", 10, 1)
split_image(10, 6, 5, 51801)
CDarkGDK.oDBImage.LoadImageB("media\expl19.png", 10, 1)
split_image(10, 6, 5, 51901)
CDarkGDK.oDBImage.LoadImageB("media\expl20.png", 10, 1)
split_image(10, 6, 5, 52001)
If CDarkGDK.oDBImage.ImageExist(10) = 1 Then
CDarkGDK.oDBImage.DeleteImage(10)
End If
For j = 1 To ex_max
CDarkGDK.oDB3D.MakeObjectPlain(ex_first + j, 100, 100)
CDarkGDK.oDB3D.DisableObjectZWrite(ex_first + j)
CDarkGDK.oDB3D.DisableObjectZDepth(ex_first + j)
CDarkGDK.oDB3D.GhostObjectOnB(ex_first + j, 3)
CDarkGDK.oDB3D.SetObjectLight(ex_first + j, 0)
CDarkGDK.oDB3D.HideObject(ex_first + j)
Next j
End Sub
Public Sub spawn_explosion(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal explosion_type As Integer, ByVal size As Integer)
If ex_counter = ex_max Then ex_counter = 0
ex_counter = ex_counter + 1
ex_alive(ex_counter) = 1
ex_frame(ex_counter) = 1
ex_delay(ex_counter) = 2
Select Case explosion_type
Case 1 : ex_first_image(ex_counter) = 50100
Case 2 : ex_first_image(ex_counter) = 50200
Case 3 : ex_first_image(ex_counter) = 50300
Case 4 : ex_first_image(ex_counter) = 50400
Case 5 : ex_first_image(ex_counter) = 50500
Case 6 : ex_first_image(ex_counter) = 50600
Case 7 : ex_first_image(ex_counter) = 50700
Case 8 : ex_first_image(ex_counter) = 50800
Case 9 : ex_first_image(ex_counter) = 50900
Case 10 : ex_first_image(ex_counter) = 51000
Case 11 : ex_first_image(ex_counter) = 51100
Case 12 : ex_first_image(ex_counter) = 51200
Case 13 : ex_first_image(ex_counter) = 51300
Case 14 : ex_first_image(ex_counter) = 51400
Case 15 : ex_first_image(ex_counter) = 51500
Case 16 : ex_first_image(ex_counter) = 51600
Case 17 : ex_first_image(ex_counter) = 51700
Case 18 : ex_first_image(ex_counter) = 51800
Case 19 : ex_first_image(ex_counter) = 51900
Case 20 : ex_first_image(ex_counter) = 52000
End Select
CDarkGDK.oDB3D.PositionObject(ex_first + ex_counter, x, y, z)
CDarkGDK.oDB3D.SetObjectToCameraOrientation(ex_first + ex_counter)
CDarkGDK.oDB3D.ZRotateObject(ex_first + ex_counter, Rnd(359))
CDarkGDK.oDB3D.TextureObject(ex_first + ex_counter, ex_first_image(ex_counter) + ex_frame(ex_counter))
CDarkGDK.oDB3D.ScaleObject(ex_first + ex_counter, size, size, size)
CDarkGDK.oDB3D.ShowObject(ex_first + ex_counter)
End Sub
Public Sub update_explosions()
For j = 1 To ex_max
If ex_alive(j) = 1 Then
If ex_delay(j) > 0 Then ex_delay(j) = ex_delay(j) - 1
If ex_delay(j) = 0 Then
ex_frame(j) = ex_frame(j) + 1
CDarkGDK.oDB3D.TextureObject(ex_first + j, ex_first_image(j) + ex_frame(j))
CDarkGDK.oDB3D.SetObjectToCameraOrientation(ex_first + j)
'changed this from 2
ex_delay(j) = 50
End If
If ex_frame(j) = 30 Then
ex_alive(j) = 0
CDarkGDK.oDB3D.HideObject(ex_first + j)
End If
End If
Next j
End Sub
Public Sub engine_kill_all_explosions()
For j = 1 To ex_max
ex_alive(j) = 0
ex_frame(j) = 0
CDarkGDK.oDB3D.HideObject(ex_first + j)
Next j
End Sub
End Class