Ohio's Heat Lightning
inspired sometime ago
Code: (Select All)
'recurring lightning w Fade.bas for QB64 fork 2017-08-23
'translated from: recurring lightning.bas for SmallBASIC 0.12.9 2017-08-22
'translated from: recurring lightning.txt for JB (B+=MGA) 2017-08-21
'2017-10-10 fade by TylerDarko and Branching Lightning by RhoSigma
Randomize Timer
Const xmax = 800
Const ymax = 600
Const FORKINESS = 15 '1 to 20
Const FREQUENCY = 3 '1 to 15
Randomize Timer
Screen _NewImage(xmax, ymax, 32)
_Title "Recurring Branching Lightning with Fade"
land& = _NewImage(xmax, ymax, 32)
_Dest land&
drawLandscape
_Dest 0
rpause = 55
While 1
_PutImage , land&, 0
If Int(Rnd(1) * 100) > 50 Then
DrawLightning Int(Rnd(1) * (xmax / 2)), 0, 50, 0.785398163, 1
Else
DrawLightning (xmax / 2) + Int(Rnd(1) * ((xmax / 2) - 1)), 0, 50, 2.35619449, 1
End If
Color _RGB(128, Rnd * 55 + 200, Rnd * 55 + 200)
_Delay rpause / 1000 '<< adjust time as needed for your system
s! = Timer
rpause = rand&&(80, 2500)
Do
Line (0, 0)-(_Width, _Height), _RGBA32(0, 0, 0, 25), BF
_Display
_Limit 60
Loop While Timer - s! < rpause / 1000 '<< adjust time as needed for your system
Wend
'============================================================
Sub DrawLightning (X&, Y&, Segments&, Dir#, Fork&)
Sign# = 0.392699081
xSeg# = xmax / (15.0 * Fork&)
ySeg# = ymax / (15.0 * Fork&)
Do
Angle& = Int(Rnd(1) * 100)
DeltaAngle# = Sign# * Angle& / 100.0
Dir# = Dir# + DeltaAngle#
Sign# = Sign# * -1.0
nX& = X& + (Cos(Dir#) * xSeg#)
nY& = Y& + (Sin(Dir#) * ySeg#)
cc&& = _RGBA(128, Rnd * 55 + 200, Rnd * 55 + 200, 15 * FORKINESS / Fork&)
DrawLine X&, Y&, nX&, nY&, cc&&
X& = nX&
Y& = nY&
If ((Fork& < 5) And (Int(Rnd(1) * 60) < (FORKINESS / Fork&))) Then
DrawLightning (X&), (Y&), 5 + Int(Rnd(1) * 10), Dir# - (2.0 * DeltaAngle#), Fork& + 2
End If
Segments& = Segments& - 1
Loop While Segments& > 0 And Y& < ymax - 100
End Sub
Sub DrawLine (x1%, y1%, x2%, y2%, cc&&)
If x1% < 0 Then
If x2% < 0 Then Exit Sub
x1% = 0
ElseIf x1% >= xmax Then
If x2% >= xmax Then Exit Sub
x1% = xmax - 1
End If
If y1% < 0 Then
If y2% < 0 Then Exit Sub
y1% = 0
ElseIf y1% >= ymax Then
If y2% >= ymax Then Exit Sub
y1% = ymax - 1
End If
If x2% < 0 Then
x2% = 0
ElseIf x2% >= xmax Then
x2% = xmax - 1
End If
If y2% < 0 Then
y2% = 0
ElseIf y2% >= ymax Then
y2% = ymax - 1
End If
Line (x1%, y1%)-(x2%, y2%), cc&&
End Sub
Sub drawLandscape
'the sky
For i = 0 To ymax
midInk 0, 0, 0, 128, 128, 128, i / ymax
Line (0, i)-(xmax, i)
Next
'the land
startH = ymax - 200
rr = 70: gg = 70: bb = 90
For mountain = 1 To 6
Xright = 0
y = startH
While Xright < xmax
' upDown = local up / down over range, change along Y
' range = how far up / down, along X
upDown = (Rnd * .8 - .35) * (mountain * .5)
range = Xright + rand&&(15, 25) * 2.5 / mountain
lastx = Xright - 1
For X = Xright To range
y = y + upDown
Color _RGB(rr, gg, bb)
Line (lastx, y)-(X, ymax), , BF 'just lines weren't filling right
lastx = X
Next
Xright = range
Wend
rr = rand&&(rr - 15, rr): gg = rand&&(gg - 15, gg): bb = rand&&(bb - 25, bb)
If rr < 0 Then rr = 0
If gg < 0 Then gg = 0
If bb < 0 Then bb = 0
startH = startH + rand&&(5, 20)
Next
End Sub
Sub midInk (r1, g1, b1, r2, g2, b2, fr)
Color _RGB(r1 + (r2 - r1) * fr, g1 + (g2 - g1) * fr, b1 + (b2 - b1) * fr)
End Sub
Function distance## (x1##, y1##, x2##, y2##)
distance## = ((x1## - x2##) ^ 2 + (y1## - y2##) ^ 2) ^ .5
End Function
Function rand&& (lo&&, hi&&)
rand&& = Int(Rnd * (hi&& - lo&& + 1)) + lo&&
End Functiontrue heat lightning needs more clouds and rarely ever sends bolts to the ground, more like flickering fluorescent bulb.
724 855 599 923 575 468 400 206 147 564 878 823 652 556 bxor cross forever

