Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Throw or Hit The Ball Example
#1
This can be used in an unlimited amount of games. It shows a ball (or cannonball) randomly being thrown or hit in a 3D perspective toward the Z axis. There is no Z axis in the code though, it uses a parabola equation I found on ChatGPT and after experimentation I came up with this. I also found the SGN command on ChatGPT that helps with choosing either a positive or negative random number. I used to do it a different way in my games, but had forgotten how I did it, so I found this. 

Feel free to use this in any of your games or programs. Would make a cool baseball or golf game I would think. Smile 

Left click the mouse to throw each time.

Code: (Select All)

'Ken's Throw The Ball Demonstration

'I got the parabola equation and SGN command for random numbers from ChatGPT and I made the rest.
'Feel free to use this as you wish.

Screen _NewImage(800, 600, 32)
Cls
_Title "Click The Left Mouse Button To Throw"
' Define the coefficients for the parabola y = ax^2 + bx + c
Dim a As Double, b As Double, c As Double

centerX = 400
centerY = 300
c = 0
s = 100
ball = 8
Do
    Do
        Do While _MouseInput
            oldm = m
            m = _MouseWheel
            If _MouseButton(1) Then
                b = Int(Rnd * _Pi) + 6
                a = Int(Rnd * 7) - 7
                randomx = (Rnd * 10) * Sgn(Rnd - 0.5)
                Cls
            End If
        Loop
    Loop Until _MouseButton(1)
    If m > oldm Then
        a = a + .1
        b = b + .1
        Cls
        oldm = m
    End If
    If m < oldm Then
        a = a - .1
        Cls
        oldm = m
    End If
    ' Set up a loop to draw the parabola
    For x = -20 To 30 + a Step .5
        ' Calculate y using the parabola equation
        y = a * (x / 10) ^ 2 + b * (x / 10) + c

        ' Convert to screen coordinates
        screenX = centerX + x * randomx
        screenY = centerY - y * 10
        If ball > 1.5 Then ball = ball - .2
        ' Plot the point
        Circle (screenX, screenY), ball, _RGB32(255, 255, 255)
        _Delay .05
        s = s + .1
        Sound s, 1
        _Display
        Cls
    Next x
    s = 100
    ball = 8
Loop Until InKey$ = Chr$(27)
End
Reply
#2
Nice small example.  Would be useful for a throw a ball at the milk bottles game, or a dart game.  I may use it for something like that.

I sometimes ask DeepAI for algorithm examples when I’m totally stuck (I’m not very math smart).   It’s only 2021 trained, and it’s QB64 code is usually broken, but not bad for a free AI that needs no registering.

- Dav

Find my programs here in Dav's QB64 Corner
Reply
#3
What is supposed to be happening with _MouseWheel, you have m, oldm and they are affecting a, b of parabolic equation but I can't see any difference when I scroll mouse?

See any difference?
Code: (Select All)
'Ken's Throw The Ball Demonstration

'I got the parabola equation and SGN command for random numbers from ChatGPT and I made the rest.
'Feel free to use this as you wish.

Screen _NewImage(800, 600, 32)
Cls
_Title "Click The Left Mouse Button To Throw"
' Define the coefficients for the parabola y = ax^2 + bx + c
Dim a As Double, b As Double, c As Double

centerX = 400
centerY = 300
c = 0
s = 100
ball = 8
Do
    Do
        Do While _MouseInput
            'oldm = m
            'm = _MouseWheel
            If _MouseButton(1) Then
                b = Int(Rnd * _Pi) + 6
                a = Int(Rnd * 7) - 7
                randomx = (Rnd * 10) * Sgn(Rnd - 0.5)
                Cls
            End If
        Loop
    Loop Until _MouseButton(1)
    'If m > oldm Then
    '    a = a + .1
    '    b = b + .1
    '    Cls
    '    oldm = m
    'End If
    'If m < oldm Then
    '    a = a - .1
    '    Cls
    '    oldm = m
    'End If
    ' Set up a loop to draw the parabola
    For x = -20 To 30 + a Step .5
        ' Calculate y using the parabola equation
        y = a * (x / 10) ^ 2 + b * (x / 10) + c

        ' Convert to screen coordinates
        screenX = centerX + x * randomx
        screenY = centerY - y * 10
        If ball > 1.5 Then ball = ball - .2
        ' Plot the point
        Circle (screenX, screenY), ball, _RGB32(255, 255, 255)
        _Delay .05
        s = s + .1
        Sound s, 1
        _Display
        Cls
    Next x
    s = 100
    ball = 8
Loop Until InKey$ = Chr$(27)
End
b = b + ...
Reply
#4
LOL Woops! I forgot to remove the mouse wheel code from when I was trying to learn the parabola variables. I had it where the mouse wheel was making the parabola wider or smaller. lol Thanks for pointing that out B+. Here is the code without it. 

Dav, I'm glad you like this. But please get this code instead, thanks.

Code: (Select All)

'Ken's Throw The Ball Demonstration

'I got the parabola equation and SGN command for random numbers from ChatGPT and I made the rest.
'Feel free to use this as you wish.

Screen _NewImage(800, 600, 32)
Cls
_Title "Click The Left Mouse Button To Throw"
' Define the coefficients for the parabola y = ax^2 + bx + c
Dim a As Double, b As Double, c As Double

centerX = 400
centerY = 300
c = 0
s = 100
ball = 8
Do
    Do
        Do While _MouseInput
            If _MouseButton(1) Then
                b = Int(Rnd * _Pi) + 6
                a = Int(Rnd * 7) - 7
                randomx = (Rnd * 10) * Sgn(Rnd - 0.5)
                Cls
            End If
        Loop
    Loop Until _MouseButton(1)
    ' Set up a loop to draw the parabola
    For x = -20 To 30 + a Step .5
        ' Calculate y using the parabola equation
        y = a * (x / 10) ^ 2 + b * (x / 10) + c

        ' Convert to screen coordinates
        screenX = centerX + x * randomx
        screenY = centerY - y * 10
        If ball > 1.5 Then ball = ball - .2
        ' Plot the point
        Circle (screenX, screenY), ball, _RGB32(255, 255, 255)
        _Delay .05
        s = s + .1
        Sound s, 1
        _Display
        Cls
    Next x
    s = 100
    ball = 8
Loop Until InKey$ = Chr$(27)
End
Reply
#5
Here's an even better one. The ball somewhat goes toward the direction of where the mouse pointer is now. It's still very random, but I think it would be a fun game. Smile 

Feel free to adjust the code of course. This was all done with experimentation. 

Code: (Select All)

'Ken's Throw The Ball Demonstration

'I got the parabola equation and SGN command for random numbers from ChatGPT and I made the rest.
'Feel free to use this as you wish.

Screen _NewImage(800, 600, 32)
Cls
_Title "Click The Left Mouse Button To Throw"
' Define the coefficients for the parabola y = ax^2 + bx + c
Dim a As Double, b As Double, c As Double

centerX = 400
centerY = 300
c = 0
s = 100
ball = 8
Randomize Timer
Do
    Do
        Do While _MouseInput
            If _MouseButton(1) Then
                b = Int(Rnd * _Pi) + 6
                a = Int(Rnd * 7) - 7
                'randomx = (Rnd * 10) * Sgn(Rnd - 0.5)
                If _MouseX < 400 Then randomx = _MouseX / 30 * -1
                If _MouseX > 399 Then randomx = _MouseX / 50
                randomy = _MouseY / 30
                Cls
            End If
        Loop
    Loop Until _MouseButton(1)
    ' Set up a loop to draw the parabola
    For x = -20 To 30 + a Step .5
        ' Calculate y using the parabola equation
        y = a * (x / 10) ^ 2 + b * (x / 10) + c

        ' Convert to screen coordinates
        screenX = centerX + x * randomx
        'screenY = centerY - y * 10
        screeny = centerY - y * randomy
        If ball > 1.5 Then ball = ball - .2
        ' Plot the point
        Circle (screenX, screeny), ball, _RGB32(255, 255, 255)
        _Delay .05
        s = s + .1
        Sound s, 1
        _Display
        Cls
    Next x
    s = 100
    ball = 8
Loop Until InKey$ = Chr$(27)
End
Reply
#6
Makes me wish once again the SOUND statement was improved to allow for volume control. Fade the volume as the ball progresses. I really never figured out why the QuickBASIC developers never structured it that way.

+1 for pseudo 3-D effect.

Pete
Shoot first and shoot people who ask questions, later.
Reply
#7
Pete, probably because QuickBasic used the internal speaker. I don't remember anything ever adjusting the volume of that, probably has a set volume.
Reply
#8
(08-25-2024, 02:49 PM)Pete Wrote: Makes me wish once again the SOUND statement was improved to allow for volume control. Fade the volume as the ball progresses. I really never figured out why the QuickBASIC developers never structured it that way.

+1 for pseudo 3-D effect.

Pete

Actually, in QB64-PE SOUND does support volume, panning and more.  Big Grin

Code: (Select All)
SOUND frequency#, duration#[, volume#][, panning#][, waveform&]
Reply
#9
Wow thanks A740g! I just improved the ball throwing example to make the ball sound volume go less and less the farther away it is.

Code: (Select All)

'Ken's Throw The Ball Demonstration

'I got the parabola equation and SGN command for random numbers from ChatGPT and I made the rest.
'Feel free to use this as you wish.

Screen _NewImage(800, 600, 32)
Cls
_Title "Click The Left Mouse Button To Throw"
' Define the coefficients for the parabola y = ax^2 + bx + c
Dim a As Double, b As Double, c As Double

centerX = 400
centerY = 300
c = 0
s = 100
ball = 8
volume = 1
Randomize Timer
Do
    Do
        Do While _MouseInput
            If _MouseButton(1) Then
                b = Int(Rnd * _Pi) + 6
                a = Int(Rnd * 7) - 7
                'randomx = (Rnd * 10) * Sgn(Rnd - 0.5)
                If _MouseX < 400 Then randomx = _MouseX / 30 * -1
                If _MouseX > 399 Then randomx = _MouseX / 50
                randomy = _MouseY / 30
                Cls
            End If
        Loop
    Loop Until _MouseButton(1)
    ' Set up a loop to draw the parabola
    For x = -20 To 30 + a Step .5
        ' Calculate y using the parabola equation
        y = a * (x / 10) ^ 2 + b * (x / 10) + c

        ' Convert to screen coordinates
        screenX = centerX + x * randomx
        'screenY = centerY - y * 10
        screeny = centerY - y * randomy
        If ball > 1.5 Then ball = ball - .2
        ' Plot the point
        Circle (screenX, screeny), ball, _RGB32(255, 255, 255)
        _Delay .05
        s = s + .1
        If volume > .05 Then volume = volume - .02
        Sound s, 1, volume
        _Display
        Cls
    Next x
    s = 100
    ball = 8
    volume = 1
Loop Until InKey$ = Chr$(27)
End
Reply
#10
(08-25-2024, 04:19 PM)a740g Wrote:
(08-25-2024, 02:49 PM)Pete Wrote: Makes me wish once again the SOUND statement was improved to allow for volume control. Fade the volume as the ball progresses. I really never figured out why the QuickBASIC developers never structured it that way.

+1 for pseudo 3-D effect.

Pete

Actually, in QB64-PE SOUND does support volume, panning and more.  Big Grin

Code: (Select All)
SOUND frequency#, duration#[, volume#][, panning#][, waveform&]
Nice! I see Ken already took advantage of it. Thanks, Sam, for adding this to the project. +2.

Pete Smile
Shoot first and shoot people who ask questions, later.
Reply




Users browsing this thread: 1 Guest(s)