fireworks.bmx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. ' Fireworks by simonh ([email protected])
  2. Strict
  3. Global width=800
  4. Global height=600
  5. Graphics width,height,16
  6. ' Create a spark type
  7. Type spark
  8. Field x#,y#,z#,vy#,xd#,yd#,zd#,r#,g#,b#,alpha#
  9. End Type
  10. ' Load spark image
  11. Global sparki:TImage=LoadImage("spark.png")
  12. ' Set no. of sparks to be created per firework
  13. Global no_sparks=500
  14. ' Create spark list
  15. Global spark_list:TList=New TList
  16. ' Load and set font
  17. Global font:TImageFont=LoadImageFont("Arial.ttf",1)
  18. SetImageFont font
  19. ' Start main loop
  20. While Not KeyHit(KEY_ESCAPE)
  21. ' If space key pressed then create new set of sparks (new firework)
  22. If KeyHit(KEY_SPACE)
  23. Local x#=Rand(-100,100)
  24. Local y#=Rand(-100,100)
  25. Local z#=200
  26. Local r#=Rand(255)
  27. Local g#=Rand(255)
  28. Local b#=Rand(255)
  29. For Local i=1 To no_sparks
  30. Local speed# = 0.1
  31. Local ang1# = Rnd!(360)
  32. Local ang2# = Rnd!(360)
  33. Local sp:spark=New Spark
  34. spark_list.AddLast sp
  35. sp.x=x#
  36. sp.y=y#
  37. sp.z=z#
  38. sp.xd=Cos(ang1#)*Cos(ang2#)*speed#
  39. sp.yd=Cos(ang1#)*Sin(ang2#)*speed#
  40. sp.zd=Sin(ang1#)*speed#
  41. sp.r=r
  42. sp.g=g
  43. sp.b=b
  44. sp.alpha=1
  45. Next
  46. EndIf
  47. ' Draw all sparks
  48. For Local sp:spark=EachIn spark_list
  49. ' If spark alpha is above 0 then draw it...
  50. If sp.alpha>0
  51. sp.x=sp.x+sp.xd*10.0
  52. sp.y=sp.y+sp.yd*10.0
  53. sp.z=sp.z+sp.zd*10.0
  54. sp.y=sp.y+sp.vy#
  55. sp.vy=sp.vy+0.02
  56. ' Calculate x and y draw values based on x,y,z co-ordinates
  57. Local x#=(width/2.0)+((sp.x/sp.z)*500)
  58. Local y#=(height/2.0)+((sp.y/sp.z)*500)
  59. sp.alpha=sp.alpha-0.01
  60. SetColor sp.r#,sp.g#,sp.b#
  61. SetBlend LIGHTBLEND
  62. SetAlpha sp.alpha
  63. SetScale 20/sp.z,20/sp.z
  64. DrawImage sparki,x#,y#
  65. '...else remove spark from spark list
  66. Else
  67. spark_list.Remove sp
  68. EndIf
  69. Next
  70. SetBlend SOLIDBLEND
  71. SetScale 1,1
  72. SetColor 255,255,255
  73. DrawText "Press space to ignite firework",0,0
  74. Flip
  75. Cls
  76. Wend