Ooops
November 28, 2020, 01:45:24 AM

Author Topic: [bmx] Fire 2D (BlitzMax library) by Curtastic [ 1+ years ago ]  (Read 613 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Fire 2D (BlitzMax library)
Author : Curtastic
Posted : 1+ years ago

Description : This is realtime, randomly-generated fire for blitzmax games.

Each fire object has a image and you can choose its width and height. Anything drawn to a Tfire.image will burst into flames. You must use writepixel if you want to draw to its image, as in this example.

I will most likely add updates and improvements to this code if there is any interest.


Code :
Code: BlitzMax
  1. 'FIRE 2D Example.
  2. Strict
  3. 'Include "fire_include.bmx" 'The include file is attached as part of this file.
  4.  
  5.  
  6. Graphics 800, 600, 16
  7. MoveMouse 300, 300
  8. SeedRnd MilliSecs()
  9.  
  10.  
  11.  
  12. Local F:TFire = TFire.Make(290, 85)
  13. Global FireBall:TFire = TFire.Make(80, 100, False)
  14.  
  15.  
  16. 'Place the big fire at the bottom-middle of the screen.
  17. F.X = GraphicsWidth() / 2 - F.SizeX / 2
  18. F.Y = GraphicsHeight() - F.SizeY
  19.  
  20. Repeat
  21.         If KeyHit(key_escape) Then End
  22.        
  23.        
  24.         'Click to make fireballs!
  25.         If MouseDown(1) Then
  26.                 FireBall.X = MouseX()
  27.                 FireBall.Y = MouseY() - 50
  28.                 FireballRemake()
  29.         EndIf
  30.        
  31.         If MouseHit(2) Then F.Clear()
  32.        
  33.         TFire.UpdateAll()
  34.         TFire.DrawAll()
  35.        
  36.        
  37.         Flip 0
  38.         Cls
  39. Forever
  40.  
  41.  
  42.  
  43. 'This is just normal code to draw a circle to an image.
  44. Function FireballRemake()
  45.         Local pixmap:TPixmap
  46.         Local x, y
  47.         Local r
  48.         Local tx#
  49.         Local rr
  50.         Local dotx, doty
  51.        
  52.         x = 40
  53.         y = 80
  54.         r = 15
  55.         rr = r * r
  56.        
  57.         pixmap = LockImage(FireBall.Image)
  58.         For doty = y - r To y + r
  59.                 tx = Sqr(rr - (doty - y) * (doty - y)) * 1.1
  60.                 For dotx = x - tx To x + tx
  61.                         WritePixel pixmap, dotx, doty, $FFFF9900
  62.                 Next
  63.         Next
  64.         UnlockImage(FireBall.Image)
  65. EndFunction
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  75. 'FIRE 2D. A BlitzMax Library.
  76. 'Made by Curtastic, 2006.
  77. 'This code is public domain.
  78. 'Please credit "Curtastic" if you use this in a product.
  79. 'Special Thanks to:
  80. ' Mark Sibly for making the Blitz Languages.
  81. ' Doreen Steinly for inspiring me to code again.
  82. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  83.  
  84.  
  85. 'Each fire has a single TImage that us updated realtime to make fire.
  86. Type TFire
  87.        
  88. 'Public:
  89.         'List of all fires created.
  90.         Global List:TList = CreateList()
  91.         'Where the top-left of the image is.
  92.         Field X:Float, Y:Float
  93.         'The realtime image of the fire. Transparent color is black.
  94.         Field Image:timage
  95.        
  96. 'Private:
  97.         'Size of image
  98.         Field SizeX, SizeY
  99.         Field MoveXLow, MoveXHigh
  100.         Field DarkenXLow, DarkenXHigh
  101.         'Holds SizeX/2
  102.         Field SizeX2
  103.         'How much the fire updates, each time update() is called.
  104.         Field Loops
  105.         'How much it moves
  106.         Field MoveLoops
  107.         'True if fire always comes from the bottom.
  108.         Field Base
  109.        
  110.        
  111.        
  112.         'NOTE:
  113.         'If base=false then
  114.         ' you need to draw things to the image yourself to make anything happen!
  115.         'If base=true then the fire will start going itself.
  116.         Function Make:TFire(SizeX = 120, SizeY = 170, Base = True)
  117.                 Local Fire:TFire
  118.                
  119.                 Fire = New TFire
  120.                 Fire.Base = Base
  121.                 Fire.SizeX = SizeX
  122.                 Fire.SizeX2 = SizeX / 2
  123.                 Fire.SizeY = SizeY
  124.                 Fire.MoveXLow = - 7
  125.                 Fire.MoveXHigh = Fire.SizeX - 1
  126.                 Fire.DarkenXLow = 0
  127.                 Fire.DarkenXHigh = Fire.SizeX - 1
  128.                
  129.                 Fire.Loops = (Fire.SizeX2 + Fire.SizeY) / 2.0 / 15
  130.                 If Fire.Loops < 1 Then Fire.Loops = 1
  131.                 Fire.MoveLoops = 25 + Fire.SizeY * 8 / Fire.SizeX2
  132.                 If Fire.MoveLoops < 1 Then Fire.MoveLoops = 1
  133.                
  134.                 Fire.Image = CreateImage(Fire.SizeX, Fire.SizeY, DYNAMICIMAGE | MASKEDIMAGE)
  135.                 If Base Then Fire.BaseDraw()
  136.                
  137.                 ListAddLast List, Fire
  138.                
  139.                 Return Fire
  140.         EndFunction
  141.        
  142.        
  143.         Method Kill()
  144.                 ListRemove List, Self
  145.         EndMethod
  146.        
  147.        
  148.         'Call this to clear the fire image.
  149.         Method Clear()
  150.                 If Base Then
  151.                         BaseDraw(True)
  152.                 Else
  153.                         Cls
  154.                         GrabImage Image, 0, 0
  155.                 EndIf
  156.         EndMethod
  157.        
  158.        
  159.         'Draws the orange rect at the base.
  160.         'If clear=True, it also clears the fire with the CLSCOLOR.
  161.         Method BaseDraw(Clear = False)
  162.                 Cls
  163.                 DrawImage Image, 0, 0
  164.                
  165.                 If Clear Then Cls
  166.                 SetColor 250, 50, 0
  167.                 DrawRect SizeX2 * .25, SizeY - 1, SizeX2 * .75 * 2, 1
  168.                 SetColor 255, 255, 255
  169.                
  170.                 GrabImage Image, 0, 0
  171.         EndMethod
  172.        
  173.        
  174.         'Draws every fire image at its x,y
  175.         Function DrawAll()
  176.                 Local Fire:TFire
  177.                
  178.                 For Fire = EachIn List
  179.                         DrawImage Fire.Image, Fire.X, Fire.Y
  180.                 Next
  181.         EndFunction
  182.        
  183.         'Updates each fire.
  184.         Function UpdateAll()
  185.                 Local Fire:TFire
  186.                
  187.                 For Fire = EachIn List
  188.                         Fire.Update()
  189.                 Next
  190.         EndFunction
  191.        
  192.        
  193.         'Makes the fire go.
  194.         Method Update()
  195.                
  196.                 Local X, Y, AddX
  197.                 Local C, R, G, GoodR
  198.                 Local Pixmap:TPixmap
  199.                 Local cx, cy
  200.                 Local poo
  201.                 Local go
  202.                
  203.                 Cls
  204.                
  205.                 Pixmap = LockImage(Image)
  206.                
  207.                 For Local loopdeloops = 1 To Loops
  208.                        
  209.                         'Darken the fire.
  210.                         For Local darkensomepixelswithcurtasticfun = 1 To 65
  211.                                
  212.                                 X = Rand(DarkenXLow, DarkenXHigh)
  213.                                
  214.                                 For Local someysfromthesamexwhynot = 1 To 8
  215.                                         Y = Rand(0, SizeY - 2)
  216.                                        
  217.                                         C = ReadPixel(Pixmap, X, Y) & $FFFFFF
  218.                                         If C <> 0 Then
  219.                                                 'Calculate the desired color.
  220.                                                 'The higher up the darker.
  221.                                                 GoodR = (Y - SizeY / 2) * 2 * 235 / SizeY
  222.                                                 'The farther away from the center x the darker.
  223.                                                 GoodR = GoodR - Abs(X - SizeX2) * 135 / SizeX2
  224.                                                 If GoodR < 0 Then GoodR = 0
  225.                                                
  226.                                                 'Color gets closer to desired color.
  227.                                                 R = (C Shr 16) & $FF
  228.                                                 R:- (R - GoodR) / 3.0
  229.                                                 If R < 10 Then
  230.                                                         WritePixel Pixmap, X, Y, 0
  231.                                                 Else
  232.                                                         G = Min(R, 20 - Abs(X - SizeX2) / (SizeX2 / 10.0))
  233.                                                         WritePixel Pixmap, X, Y,..
  234.                                                          $FF000000 | (R Shl 16) | (G Shl 8) | Int(G * .7)
  235.                                                 EndIf
  236.                                         EndIf
  237.                                 Next
  238.                         Next
  239.                        
  240.                         'Make the fire move.
  241.                         For Local imfeelingfatandsassy = 1 To MoveLoops
  242.                                
  243.                                 X = Rand(MoveXLow, MoveXHigh)
  244.                                
  245.                                 'Move toward the center if near the edge of the image.
  246.                                 If X < MoveXLow + 5 Then
  247.                                         AddX = 1
  248.                                 ElseIf X > MoveXHigh - 5 Then
  249.                                         AddX = - 1
  250.                                 Else
  251.                                         'Move random(-1,+1)
  252.                                         AddX = Rand(0, 2) - 1
  253.                                 EndIf
  254.                                
  255.                                 'Like CopyRect, but it copies a diagnol shape.
  256.                                 For Local someysfromthesamexwhynot = 1 To 2
  257.                                         Y = Rnd(1, SizeY)
  258.                                         poo = 1
  259.                                         go = 1
  260.                                         For cy = Y To Min(Y + 8, Image.height - 2)
  261.                                                 poo:+ go
  262.                                                 If poo > 3 Then go = - 1
  263.                                                 For cx = Max(X - poo, 1) To Min(X + poo, Image.width - 2)
  264.                                                         WritePixel Pixmap, cx + AddX, cy - 1, ReadPixel(Pixmap, cx, cy)
  265.                                                 Next
  266.                                         Next
  267.                                 Next
  268.                         Next
  269.                 Next
  270.                
  271.                 UnlockImage(Image)
  272.                
  273.                
  274.         EndMethod
  275.        
  276. EndType


Comments :


BlitzSupport(Posted 1+ years ago)

 Nice one, thanks.


Apollonius(Posted 1+ years ago)

 I'm very impressed, I love the effect! Awesome for a platformer, unless I took the time to try to modify it so it can rotate like a fireball so i can shot it in my game lol... Not that skilled yet to take other ppls' code and modify it but my passion for game dev. is as eternal as your blazing fire curtastic!


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal