(05-24-2022, 12:58 AM)SierraKen Wrote: B+, I've been using your math code from this game to make an example of wall reflection. It's not perfect, but I thought I would show you what I made using this code. If you have any suggestions or comments, I'm all ears. Thanks for making this game!
Code: (Select All)'Walls Reflection Example by SierraKen
'Reflection math from B+'s Air Hockey.
Screen _NewImage(800, 600, 32)
Const pr = 20 '
Const pr2 = 2 * pr '
start:
Cls
cx = 350: cy = 250: r = 20
c = _RGB32(0, 255, 0)
rr = 20
cc = _RGB32(255, 0, 0)
speed = 5
Dim pao
Randomize Timer
pao = _Pi(1 / 10) * Rnd
If Rnd < .5 Then pa = _Pi(.5) Else pa = _Pi(1.5)
If Rnd < .5 Then pa = pa + pao Else pa = pa - pao
_Title "Reflection Walls Example - Press Space Bar to reset."
Do
_Limit 100
a$ = InKey$
If a$ = " " Then GoTo start:
If a$ = Chr$(27) Then End
Line (100, 100)-(700, 500), _RGB32(255, 255, 255), B
Do While _MouseInput 'mouse status changes only
x = _MouseX
y = _MouseY
Loop
fillCircle x, y, rr, cc
If Sqr((x - cx) ^ 2 + (y - cy) ^ 2) < (pr + pr2) Then
pa = _Atan2(y - cy, x - cx)
pa = _Pi(1) - pa
GoTo go:
End If
go:
cx = cx + speed * Cos(pa)
cy = cy + speed * Sin(pa)
If cx > 675 Then pa = -pa: speed = -speed
If cx < 125 Then pa = -pa: speed = -speed
If cy > 475 Then pa = -pa
If cy < 125 Then pa = -pa
fillCircle cx, cy, r, c
_Display
Cls
Loop
'from Steve Gold standard
Sub fillCircle (CX As Integer, CY As Integer, R As Integer, C As _Unsigned Long)
Dim Radius As Integer, RadiusError As Integer
Dim X As Integer, Y As Integer
Radius = Abs(R): RadiusError = -Radius: X = Radius: Y = 0
If Radius = 0 Then PSet (CX, CY), C: Exit Sub
Line (CX - X, CY)-(CX + X, CY), C, 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), C, BF
Line (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
End If
X = X - 1
RadiusError = RadiusError - X * 2
End If
Y = Y + 1
Line (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
Line (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
Wend
End Sub
@SierraKen and all who want a good model to work from:
After I fixed the sum of 2 radius for collision, I saw the ball still not travelling correctly specially off the mouse so I overhauled everything for clear Model of Ball Reflections. It is important to point out when ball collides with mouse or wall to pull it out of collision point and then send it on it's merry way.
Also want to say, the physics of this is not correct, it is over simplified bounce off paddle.
Code: (Select All)
_Title " 2022-05-24 b+ Overhaul of Ken's Reflection Walls Example"
'Walls Reflection Example by SierraKen
'Reflection math from B+'s Air Hockey.
Randomize Timer
Screen _NewImage(800, 600, 32)
'' Const pr = 20 ' not using !
'' Const pr2 = 2 * pr ' not using !
' thses remain constant
px = 350: py = 250: pr = 5: pc = _RGB32(0, 255, 0) ' <<<< lets label everything of puck with p
speed = 5 ' really keeping puck at constant speed
mr = 50: mc = _RGB32(255, 0, 0) ' <<<< evrything mouse starts with m , use different radius for mouse
start:
px = 400: py = 300
Cls
'pao = _Pi(1 / 10) * Rnd ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ???? this is silly
'If Rnd < .5 Then pa = _Pi(.5) Else pa = _Pi(1.5) ' ?????
'If Rnd < .5 Then pa = pa + pao Else pa = pa - pao '???
pa = _Pi(2) * Rnd ' pa = puck angle this is rnd times all directions 0 to 360 in degrees 0 to 2*pi in radians
_Title "Reflection Walls Example - Press Space Bar to reset."
Do
Cls ' Clear our work and recalulate and redraw everything
Line (100, 100)-(700, 500), _RGB32(255, 255, 255), B ' draw the boundary
a$ = InKey$
If a$ = " " Then GoTo start:
If a$ = Chr$(27) Then End
'inefficient way to poll mouse = update mx and my
'Do While _MouseInput 'mouse status changes only
' x = _MouseX
' y = _MouseY
'Loop
While _MouseInput: Wend ' better way to poll mouse and label mouse x, y as mx, my like everyone else
mx = _MouseX
my = _MouseY
fillCircle mx, my, mr, mc ' draw mouse paddle
' check for collision
' first part measure distance between mouse center and puck center, is it less than radius of mouse + puck?
If Sqr((mx - px) ^ 2 + (my - py) ^ 2) < (pr + mr) Then ' (pr + pr2) to (r + rr) collision!
pa = _Atan2(py - my, px - mx) ' get the angle of the puck to the mouse
px = px + speed * Cos(pa) ' move the puck out of the mouse paddle
py = py + speed * Sin(pa) '
' show the collision and replacement of ball AFTER removed from inside the mouse
Line (mx, my)-(px, py), &HFFFFFFFF
_Display
_Delay .1
End If
'keep puck out of wall = wall boundary +- radius of puck
If px > 700 - pr Then pa = _Pi - pa: px = 700 - pr ' move puck out of wall !!!
If px < 100 + pr Then pa = _Pi - pa: px = 100 + pr ' move puck out of wall !!!
If py > 500 - pr Then pa = -pa: py = 500 - pr ' move puck out of wall !!!
If py < 100 + pr Then pa = -pa: py = 100 + pr ' move puck out of wall !!!
' nove the puck along and draw it
px = px + speed * Cos(pa) ' now move the puck along it's new direction pa = puck angle
py = py + speed * Sin(pa) '
fillCircle px, py, pr, pc ' draw puck
_Display
_Limit 60 ' hold screen for moment
Loop
'from Steve Gold standard
Sub fillCircle (CX As Integer, CY As Integer, R As Integer, C As _Unsigned Long)
Dim Radius As Integer, RadiusError As Integer
Dim X As Integer, Y As Integer
Radius = Abs(R): RadiusError = -Radius: X = Radius: Y = 0
If Radius = 0 Then PSet (CX, CY), C: Exit Sub
Line (CX - X, CY)-(CX + X, CY), C, 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), C, BF
Line (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
End If
X = X - 1
RadiusError = RadiusError - X * 2
End If
Y = Y + 1
Line (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
Line (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
Wend
End Sub
b = b + ...