You just made a good point supporting the use of Subs over Functions!
Try and return an array or structure/UDT with a function (in QB64).
OTOH normally you use a sub to draw something but when reviewing my handy Subs and Functions in my toolbox last night (BTW Subs outnumber Functions maybe 5 to 1 !) I found a Function that draws a Sky for background according to a light percentage from 0 to 100. It's a function because it makes a background image that you can reuse in mainloop for drawing same background to clear screen and update animation action. So it returns the handle to that image which needs to be shared with Main program to use in loop.
Here is quick demo test (not using it in a loop over and over again for a background for an animation) just comparing different light settings:
Try and return an array or structure/UDT with a function (in QB64).
OTOH normally you use a sub to draw something but when reviewing my handy Subs and Functions in my toolbox last night (BTW Subs outnumber Functions maybe 5 to 1 !) I found a Function that draws a Sky for background according to a light percentage from 0 to 100. It's a function because it makes a background image that you can reuse in mainloop for drawing same background to clear screen and update animation action. So it returns the handle to that image which needs to be shared with Main program to use in loop.
Here is quick demo test (not using it in a loop over and over again for a background for an animation) just comparing different light settings:
Code: (Select All)
_Title "DrawSky&(light) test" 'b+ 2025-05-22
Screen _NewImage(800, 600, 32)
_ScreenMove 250, 60
For i = 0 To 100 Step 12.5
hdl& = DrawSky&(i)
_PutImage , hdl&, 0
_Title "DrawSky&(light) test, light at" + Str$(i) + "%"
_Display
Sleep
Next
Function DrawSky& (light As Long) ' light = 0 to 100 as percent
' needs MidInk~&() Function
Dim As _Unsigned Long saveColor, c
Dim As Long i, rtn, saveDest
Dim r, rn, xx, yy, lite
lite = 2 * light
saveDest = _Dest
saveColor = _DefaultColor(saveDest)
rtn = _NewImage(_Width, _Height, 32)
_Dest rtn&
For i = 0 To _Height - 1
c = midInk(.75 * lite + 10, .75 * lite + 5, 35 + .75 * lite, 25 + lite, lite, 55 + lite, i / (_Height - 1))
Line (0, i)-(_Width, i), c
Next
'stars only in low lite
If lite <= 100 Then
For i = 1 To _Width * _Height / 1500
rn = Rnd: xx = Rnd * _Width: yy = Rnd * _Height
If rn < .01 Then
For r = 0 To 2 Step .5
Circle (xx, yy), r, _RGB32(185, 185, 185)
Next
ElseIf rn < .2 Then
Circle (xx, yy), 1, _RGB32(185, 185, 185)
PSet (xx, yy), _RGB32(185, 185, 185)
Else
PSet (xx, yy), _RGB32(185, 185, 185)
End If
Next
End If
_Dest saveDest
Color saveColor
DrawSky& = rtn
End Function
Function midInk~& (r1%, g1%, b1%, r2%, g2%, b2%, fr##)
midInk~& = _RGB32(r1% + (r2% - r1%) * fr##, g1% + (g2% - g1%) * fr##, b1% + (b2% - b1%) * fr##)
End Function
b = b + ...