Fun little code to play with! Please forgive me for butting in, but I couldn't resist modding it too!
- Dav
Code: (Select All)
Dim w, h
w = 640
h = 640
Screen _NewImage(w, h, 32)
_ScreenMove 340, 60
Dim i, t, x, y
Do
t = t + 0.01
Line (0, 0)-(w, h), _RGBA(0, 0, 0, 25), BF
For i = 1 To 8
Color _RGBA(i * 32, i * 32 * .7, 0, i * 32)
For x = 0 To w
y = 100 * Sin(_Pi * x / w) * Sin(1 * _Pi * x / w + t + i * t * _Pi * 0.1)
Circle (x, h / 2 + y), i
Circle (w / 2 + y, x), i
Next
Next
_Display
_Limit 30
Loop
(09-04-2023, 01:00 AM)Dav Wrote: Fun little code to play with! Please forgive me for butting in, but I couldn't resist modding it too!
- Dav
Code: (Select All)
Dim w, h
w = 640
h = 640
Screen _NewImage(w, h, 32)
_ScreenMove 340, 60
Dim i, t, x, y
Do
t = t + 0.01
Line (0, 0)-(w, h), _RGBA(0, 0, 0, 25), BF
For i = 1 To 8
Color _RGBA(i * 32, i * 32 * .7, 0, i * 32)
For x = 0 To w
y = 100 * Sin(_Pi * x / w) * Sin(1 * _Pi * x / w + t + i * t * _Pi * 0.1)
Circle (x, h / 2 + y), i
Circle (w / 2 + y, x), i
Next
Next
_Display
_Limit 30
Loop
'Option _Explicit 'edit for QBJS 2023-09-08
_Title "le bombe"
'QB64 X 64 version 1.2 20180228/86 from git b301f92
'2018-07-28 translated from
'bomb.bas for SmallBASIC 0.12.2 [B+=MGA] 2016-05-09
'from explosion study
Const xmax = 800
Const ymax = 600
Screen _NewImage(xmax, ymax, 32)
'_ScreenMove 360, 60
Const max_particles = 1000
Const gravity = .25
Const air_resistance = .95
Type particle
x As Single
y As Single
dx As Single
dy As Single
size As Single
kolor As Long
tf As Integer
End Type
Dim Shared dots(max_particles) As particle
Dim As Long i, rounds, loop_count
'main
While Not _KeyDown(27)
For i = 1 To 100
NewDot i
Next
rounds = 100
For i = 12 To 0 Step -1
If _KeyDown(27) Then End
Cls
DrawSky
DrawGround
DrawBomb
DrawFuse i
_Display
If i = 0 Then _Delay Rnd * 3 Else _Delay .100
Next
Line (0, 0)-(xmax, ymax), _RGB32(255, 255, 255), BF
_Display
_Delay .02
For loop_count = 0 To 150
If _KeyDown(27) Then End
DrawSky
DrawGround
If loop_count < 4 Then
Color _RGB(64 - 8 * loop_count, 40 - 4 * loop_count, 32 - 4 * loop_count)
If loop_count < 8 Then fcirc xmax / 2, ymax / 2, 30 * (1 - loop_count * .25)
End If
For i = 1 To rounds
dots(i).x = dots(i).x + dots(i).dx
dots(i).y = dots(i).y + dots(i).dy
If Rnd < .2 And rounds > 10 And dots(i).y > ymax / 2 Then dots(i).dx = 0: dots(i).dy = 0
dots(i).dx = dots(i).dx * air_resistance
If dots(i).dy <> 0 Then dots(i).dy = air_resistance * dots(i).dy + .4 'air resistance and gravity
If dots(i).tf Then
Line (dots(i).x, dots(i).y)-Step(dots(i).size, dots(i).size), dots(i).kolor, BF
Else
Color dots(i).kolor
fcirc dots(i).x, dots(i).y, dots(i).size / 2
End If
Next
If rounds < max_particles Then
For i = 1 To 100
NewDot (rounds + i)
Next
rounds = rounds + 100
End If
Color _RGB32(255, 255, 255), _RGB32(0, 0, 255)
Locate 1, 1: Print loop_count
_Display
_Limit 60
Next
Wend
Sub NewDot (i)
Dim angle, r
angle = _Pi(Rnd * 2)
dots(i).x = xmax / 2 + Rnd * 30 * Cos(angle)
dots(i).y = ymax / 2 + Rnd * 30 * Sin(angle)
r = Rnd 'STxAxTIC recommended for rounder spreads
dots(i).dx = r * 45 * Cos(angle)
dots(i).dy = r * 45 * Sin(angle)
dots(i).size = Rnd * 7
dots(i).kolor = _RGB32(10 + Rnd * 100, 5 + Rnd * 50, 3 + Rnd * 25)
dots(i).tf = (Rnd * 2) \ 1
End Sub
Sub DrawSky
Dim i
For i = 0 To ymax / 2
Line (0, i)-Step(xmax, 0), _RGB32(0, 0, 95 * i \ (ymax / 2) + 160)
Next
End Sub
Sub DrawBomb
Dim cx, cy, radius, angle, rad_angle, x1, y1
Dim As Long i
cx = xmax / 2: cy = ymax / 2 - 70: radius = 10
For i = 60 To 0 Step -1 'main body
Color _RGB32(240 - 4 * i, 180 - 3 * i, 120 - 2 * i)
fcirc cx, ymax / 2, i
Next
For angle = 0 To 180 'fuse shaft
rad_angle = _D2R(angle)
x1 = cx + radius * Cos(rad_angle)
y1 = cy + radius * .25 * Sin(rad_angle)
Line (x1, y1)-Step(0, 20), _RGB32(127 + 127 * Cos(rad_angle), 127 + 127 * Cos(rad_angle), 127 + 127 * Cos(rad_angle))
Next
Color _RGB32(0, 0, 0)
fEllipse cx, cy, radius, .25 * radius
End Sub
Sub DrawFuse (length)
Dim cx, cy, rn, rad_angle, x1, y1, x2, y2
Dim As Long i
cx = xmax / 2: cy = ymax / 2 - 70
If length <= 0 Then Exit Sub
Color _RGB32(255, 255, 0)
Line (cx, cy - (5 + 2 * length))-Step(2, 5), , BF
fcirc cx, cy - (1 + 2 * length), 2
rn = (Rnd * 5) \ 1 + 3
For i = 1 To rn
rad_angle = _Pi(Rnd) + _Pi
x1 = cx + 7 * Cos(rad_angle): x2 = cx + 14 * Cos(rad_angle)
y1 = cy - (1 + 2 * length) + 9 * Sin(rad_angle): y2 = cy - (1 + 2 * length) + (Rnd * 13 + 9) * Sin(rad_angle)
Line (x1, y1)-(x2, y2), _RGB32(255, 255, 255)
Next
For i = 1 To length
rad_angle = _Pi(Rnd * 2)
x1 = 3 * Cos(rad_angle)
y1 = 3 * .25 * Sin(rad_angle)
Line (cx, cy - 2 * i)-Step(x1, y1), _RGB32(Rnd * 65 + 190, Rnd * 65 + 190, Rnd * 20 + 235), BF
Next
End Sub
Sub DrawGround
Dim As Long i
For i = ymax / 2 To ymax
Line (0, i)-Step(xmax, 0), _RGB32(0, 160 - 96 * (i - ymax / 2) \ (ymax / 2), 0)
Next
End Sub
Sub fcirc (CX As Long, CY As Long, R As Long)
Dim subRadius As Long, RadiusError As Long
Dim X As Long, Y As Long
subRadius = Abs(R)
RadiusError = -subRadius
X = subRadius
Y = 0
If subRadius = 0 Then PSet (CX, CY): Exit Sub
' Draw the middle span here so we don't draw it twice in the main loop,
' which would be a problem with blending turned on.
Line (CX - X, CY)-(CX + X, CY), , BF
While X > Y
RadiusError = RadiusError + Y * 2 + 1
If RadiusError >= 0 Then
If X <> Y + 1 Then
Line (CX - Y, CY - X)-(CX + Y, CY - X), , BF
Line (CX - Y, CY + X)-(CX + Y, CY + X), , BF
End If
X = X - 1
RadiusError = RadiusError - X * 2
End If
Y = Y + 1
Line (CX - X, CY - Y)-(CX + X, CY - Y), , BF
Line (CX - X, CY + Y)-(CX + X, CY + Y), , BF
Wend
End Sub
Sub fEllipse (CX As Long, CY As Long, xRadius As Long, yRadius As Long)
Dim scale As Single, x As Long, y As Long
scale = yRadius / xRadius
Line (CX, CY - yRadius)-(CX, CY + yRadius), , BF
For x = 1 To xRadius
y = scale * Sqr(xRadius * xRadius - x * x)
Line (CX + x, CY - y)-(CX + x, CY + y), , BF
Line (CX - x, CY - y)-(CX - x, CY + y), , BF
Next
End Sub
'Option _Explicit
'_Title "Plasma Laser Cannon Pointer" ' for QBJS b+ 2023-09-21
' start mod from Plasma Laser Canon demo prep for GUI 2020-11-11
Screen _NewImage(1200, 600, 32)
Randomize Timer
Dim Shared As Long ShipLights
Dim Shared As _Unsigned Long ShipColor
Dim As Long cx, cy, mx, my, mb, sx, sy
Dim As Single ma, md, dx, dy
cy = _Height / 2: cx = _Width / 2
ShipColor = &HFF3366AA
' _MouseHide '??? not supported and bad idea anyway
Do
Cls
While _MouseInput: Wend
mx = _MouseX: my = _MouseY: mb = _MouseButton(1)
dx = mx - cx ' ship avoids collision with mouse
dy = my - cy
ma = _Atan2(dy, dx)
md = Sqr(dy * dy + dx * dx)
If md < 80 Then md = 80
sx = cx + md * Cos(ma + 3.1415)
sy = cy + md * Sin(ma + 3.1415)
drawShip sx, sy, ShipColor
If mb Then
PLC sx, sy, mx, my, 10 ' Fire!
ShipColor = _RGB32(Int(Rnd * 256), Int(Rnd * 136) + 120, Int(Rnd * 156) + 100)
End If
_Display
_Limit 60
Loop Until _KeyDown(27)
Sub PLC (baseX, baseY, targetX, targetY, targetR) ' PLC for PlasmaLaserCannon
Dim r, g, b, hp, ta, dist, dr, x, y, c, rr
r = Rnd ^ 2 * Rnd: g = Rnd ^ 2 * Rnd: b = Rnd ^ 2 * Rnd: hp = _Pi(.5) ' red, green, blue, half pi
ta = _Atan2(targetY - baseY, targetX - baseX) ' angle of target to cannon base
dist = _Hypot(targetY - baseY, targetX - baseX) ' distance cannon to target
dr = targetR / dist
For r = 0 To dist Step .25
x = baseX + r * Cos(ta)
y = baseY + r * Sin(ta)
c = c + .3
Color _RGB32(128 + 127 * Sin(r * c), 128 + 127 * Sin(g * c), 128 + 127 * Sin(b * c))
fcirc x, y, dr * r
Next
For rr = dr * r To 0 Step -.5
c = c + 1
Color _RGB32(128 + 127 * Sin(r * c), 128 + 127 * Sin(g * c), 128 + 127 * Sin(b * c))
fcirc x, y, rr
Next
End Sub
Sub drawShip (x, y, colr As _Unsigned Long) 'shipType collisions same as circle x, y radius = 30
' shared here ShipLights
Dim light As Long, r As Long, g As Long, b As Long
r = _Red32(colr): g = _Green32(colr): b = _Blue32(colr)
Color _RGB32(r, g - 120, b - 100)
fEllipse x, y, 6, 15
Color _RGB32(r, g - 60, b - 50)
fEllipse x, y, 18, 11
Color _RGB32(r, g, b)
fEllipse x, y, 30, 7
For light = 0 To 5
Color _RGB32(ShipLights * 50, ShipLights * 50, ShipLights * 50)
fcirc x - 30 + 11 * light + ShipLights, y, 1
Next
ShipLights = ShipLights + 1
If ShipLights > 5 Then ShipLights = 0
End Sub
' these do work in QBJS without mod see le bombe
Sub fcirc (CX As Long, CY As Long, R As Long)
Dim subRadius As Long, RadiusError As Long
Dim X As Long, Y As Long
subRadius = Abs(R)
RadiusError = -subRadius
X = subRadius
Y = 0
If subRadius = 0 Then PSet (CX, CY): Exit Sub
' Draw the middle span here so we don't draw it twice in the main loop,
' which would be a problem with blending turned on.
Line (CX - X, CY)-(CX + X, CY), , BF
While X > Y
RadiusError = RadiusError + Y * 2 + 1
If RadiusError >= 0 Then
If X <> Y + 1 Then
Line (CX - Y, CY - X)-(CX + Y, CY - X), , BF
Line (CX - Y, CY + X)-(CX + Y, CY + X), , BF
End If
X = X - 1
RadiusError = RadiusError - X * 2
End If
Y = Y + 1
Line (CX - X, CY - Y)-(CX + X, CY - Y), , BF
Line (CX - X, CY + Y)-(CX + X, CY + Y), , BF
Wend
End Sub
Sub fEllipse (CX As Long, CY As Long, xRadius As Long, yRadius As Long)
Dim scale As Single, x As Long, y As Long
scale = yRadius / xRadius
Line (CX, CY - yRadius)-(CX, CY + yRadius), , BF
For x = 1 To xRadius
y = scale * Sqr(xRadius * xRadius - x * x)
Line (CX + x, CY - y)-(CX + x, CY + y), , BF
Line (CX - x, CY - y)-(CX - x, CY + y), , BF
Next
End Sub