Mouse Help Needed
#1
I'm doing another update for Ken's Artillery 2 using sliders for the power and angle. I got the sliders themselves working OK, but for some reason the computer keeps thinking the mouse button is pressed on each turn and after one turn, and then the computer, the computer takes over and shoots from your guy thinking you have pressed the mouse already. For a long time I've had some issues with the mouse commands and I'm not sure how to fix this. Any help is appreciated, thank you. I put comment lines where the code is at to help you. Also, I spent over 2 hours trying to fix this trying many different ways and loops, etc. No success, this is as best as I can get it so far. Is there a command to reset the _mousebutton (1) command? Because that's all I really need. 

Code: (Select All)
'I've always wanted to make this game ever since I started programming in the 80's.
'This was created by Ken G. with much help from others below.
'Thank you to B+ for much of the math code.
'It takes the computer a little time to learn how to hit your base.
'Created on June 26, 2019.
'Version 2 made on April 30, 2022.
'Added: Levels, random colored mountains, and better looking cannons.

_Title "Ken's Artillery 2"
_Limit 200
Cls
Screen _NewImage(1200, 700, 32)
Print "                                              Ken's Artillery 2"
Print: Print: Print
Print "                                      By SierraKen with math help from B+."
Print: Print: Print
Print "                         Instructions: You play against the computer by shooting a cannonball"
Print "                         from your cannon at your base on the left side of the screen"
Print "                         to the computer's base on the right side of the screen."
Print "                         To do this, you type a power number between 0 and 80 and press Enter."
Print "                         Then you type an angle that the cannonball will travel at,"
Print "                         between 0 and 90 and press Enter."
Print "                         You get a point every time you hit the other base."
Print "                         If you hit the enemy 5 times you advance to the next mountain."
Print "                         If the enemy hits you 5 times in one mountain, you lose."
Print "                         Watch the wind speed indicator up on top to see the direction and"
Print "                         speed of the wind, which makes a big difference on where your"
Print "                         cannonball will land. Also, there will be a random sized mountain"
Print "                         and color for every level and game."
Print: Print: Print
Input "                         Press Enter to begin.", start$
Cls
level = 1

start:
c = 0
mountain = 0
win = 0
compoints = 0
points = 0
ground = 590 'up is negative in direction

'Your Cannon

cbx = 10 '              cannon butt end x, y
cby = ground - 20
cmx = 50 '              cannon mouth end
cmy = ground - 70

'Computer's Cannon

cbx2 = 1190
cby2 = cby
cmx2 = 1150
cmy2 = cmy


g = .15 '       with air resistance
Randomize Timer
air = Int(Rnd * 20)
air2 = air / 1000
Randomize Timer
air3 = Int(Rnd * 100)
If air3 > 50 Then air2 = -air2
airX = air2
Color , _RGB32(156, 210, 237)
Cls
'Bases
Line (cbx, ground)-(cbx + 100, ground - 20), _RGB32(4, 4, 4), BF
Line (cbx2, ground)-(cbx2 - 100, ground - 20), _RGB32(4, 4, 4), BF
'Mountain
Randomize Timer
sz = Int(Rnd * 300) + 100
circx = 595
cl1 = Int(Rnd * 55) + 50
cl2 = Int(Rnd * 55) + 50
cl3 = Int(Rnd * 55) + 50
Line (0, ground)-(1200, 700), _RGB32(cl1, cl2, cl3), BF 'ground
Circle (circx, ground), sz, _RGB32(cl1, cl2, cl3)
Paint (circx, ground - 2), _RGB32(cl1, cl2, cl3)
again:
Color _RGB(0, 0, 0)
Locate 10, 136: Print "              "
Locate 10, 2: Print "Your Turn     "
Randomize Timer
air = Int(Rnd * 20)
air2 = air / 1000
Randomize Timer
air3 = Int(Rnd * 100)
If air3 > 50 Then air2 = -air2
airX = air2
airx2 = airX * 1000
If airx2 < -1 Then winddir$ = "West"
If airx2 > 1 Then winddir$ = "East"
If airx2 > -1 And airx2 < 1 Then winddir$ = "Sunny"
If airx2 < 0 Then airx2 = airx2 * -1

GoSub Wind:
_PrintString (5, 50), "Power"
_PrintString (5, 80), "Angle"
Line (60, 40)-(260, 70), _RGB32(255, 255, 255), B
Line (60, 70)-(260, 100), _RGB32(255, 255, 255), B
Line (60, 100)-(120, 130), _RGB32(255, 0, 5), BF
Color _RGB32(0, 0, 0), _RGB32(255, 0, 5)
_PrintString (70, 110), "Fire!"
vel = 40
vel2 = 100
a = 45
a2 = 100
Line (61, 41)-(vel2, 69), _RGB32(255, 0, 1), BF
Line (61, 71)-(a2, 99), _RGB32(0, 255, 1), BF


'This is the part that I can't fix --------------------------------------------------------

go:
Do While _MouseInput
    If Point(_MouseX, _MouseY) = _RGB32(255, 0, 1) And _MouseButton(1) = -1 Then
        vel2 = _MouseX + 5
        If vel2 > 259 Then vel2 = 259
        Line (61, 41)-(259, 69), _RGB32(156, 210, 237), BF
        Line (61, 41)-(vel2, 69), _RGB32(255, 0, 1), BF
        vel = Int(vel2 / 4)
        vel$ = Str$(vel)
        Color _RGB32(0, 0, 0), _RGB32(255, 0, 0)
        _PrintString (265, 50), vel$
        _Display
    End If
    If Point(_MouseX, _MouseY) = _RGB32(0, 255, 1) And _MouseButton(1) = -1 Then
        a2 = _MouseX + 5
        If a2 > 259 Then a2 = 259
        Line (61, 71)-(259, 99), _RGB32(156, 210, 237), BF
        Line (61, 71)-(a2, 99), _RGB32(0, 255, 1), BF
        a = Int(a2 / 3)
        aaa$ = Str$(a)
        Color _RGB32(0, 0, 0), _RGB32(0, 255, 0)
        _PrintString (265, 80), aaa$
        _Display
    End If
    If Point(_MouseX, _MouseY) = _RGB32(255, 0, 5) And _MouseButton(1) = -1 Then
        GoTo going:
    Else
        GoTo go:
    End If
Loop
Line (61, 41)-(vel2, 69), _RGB32(255, 0, 1), BF
Line (61, 71)-(a2, 99), _RGB32(0, 255, 1), BF

GoTo go:

'--------------------------------------------------------------------------------------------
going:
Color _RGB32(0, 0, 0), _RGB32(156, 210, 237)
If a > 90 Then a = 90
If a < 0 Then a = 0
If vel < 0 Then vel = 0
If vel > 80 Then vel = 80
vel = Int(vel / 4)
a = 360 - a
ca = _D2R(a)
cmx = cbx + (100 * Cos(_D2R(a)))
cmy = cby + (100 * Sin(_D2R(a)))

'initialize
bx = cmx 'ball x, y same as cannon mouth at start of shot
by = cmy


dx = vel * Cos(ca) 'start at cannon mouth
dy = vel * Sin(ca)

'shot

Do
    _Limit 200
    GoSub Wind:

    a$ = InKey$
    If a$ = Chr$(27) Then End
    Circle (bx, by), 5, _RGB32(0, 0, 0)
    Paint (bx, by), _RGB32(0, 0, 0), _RGB32(0, 0, 0)
    For ccc = 0 To 7 Step .1
        Line (cbx, cby)-(cmx + ccc, cmy), _RGB32(150, 50, 0) 'cannon line
    Next ccc
    oldbx = bx: oldby = by
    dx = dx + airX
    dy = dy + g
    bx = bx + dx
    by = by + dy
    _Display
    _Limit 30
    Circle (oldbx, oldby), 5, _RGB(156, 210, 237)
    Paint (oldbx, oldby), _RGB(156, 210, 237)
    If Point(bx, by) = _RGB32(cl1, cl2, cl3) Then
        mountain = 1
        For explosion = 0 To 20 Step .5
            Circle (bx, by), explosion, _RGB32(156, 210, 237)
            Sound 100 + explosion, .25
        Next explosion
    End If
    If bx > cbx2 - 120 And bx < cbx2 + 20 And by >= ground - 2 Then
        points = points + 1
        win = 0
        Locate 3, 64: Print "You: "; points; " Computer: "; compoints
        For explosion = 0 To 20 Step .5
            Circle (bx, by), explosion, _RGB32(156, 210, 237)
            Sound 100 + explosion, .25
        Next explosion
        For sndd = 500 To 700 Step 50
            Sound sndd, 1
        Next sndd
        mountain = 1
        If points = 5 And win = 0 Then win = 1: level = level + 1: GoTo start:
    End If
Loop Until mountain = 1 Or by > 700
For ccc = 0 To 7 Step .1
    Line (cbx, cby)-(cmx + ccc, cmy), _RGB32(156, 210, 237) 'delete cannon line
Next ccc
mountain = 0
'The Computer's Turn

comp:

Color _RGB(0, 0, 0)
Locate 10, 2: Print "                      "
Locate 10, 137: Print "Computer Turn"
GoSub Wind:

'Computer learns as it goes but is not perfect, like a human.  ;-)
If c = 0 Then GoTo compstuff:
oldvel2 = vel2

compstuff:
Randomize Timer
vel2 = Int(Rnd * 35) + 30

a2 = a

vel2 = Int(vel2 / 4)

If c = 0 Then GoTo nex:
'Last shot was too far away.
If oldbx2 < cbx Then
    vel2 = oldvel2 - 1
    If vel2 < 8 Then vel2 = 8
End If
'Last shot wasn't far enough.
If oldbx2 > cbx Then
    vel2 = oldvel2 + 1
    If vel2 > 15 Then vel2 = 15
End If
nex:
c = 1
ca2 = _D2R(a2)
cmx2 = cbx2 - (100 * Cos(_D2R(a2)))
cmy2 = cby2 + (100 * Sin(_D2R(a2)))

'initialize
bx2 = cmx2 'ball x, y same as cannon mouth at start of shot
by2 = cmy2
dx2 = vel2 * Cos(ca2) 'start at cannon mouth
dy2 = vel2 * Sin(ca2)

'shot

Do
    _Limit 200
    a$ = InKey$
    If a$ = Chr$(27) Then End
    Circle (bx2, by2), 5, _RGB32(0, 0, 0)
    Paint (bx2, by2), _RGB32(0, 0, 0), _RGB32(0, 0, 0)
    For ccc = 0 To 7 Step .1
        Line (cbx2, cby2)-(cmx2 - ccc, cmy2), _RGB32(150, 50, 0) 'cannon line
    Next ccc
    oldbx2 = bx2: oldby2 = by2
    dx2 = dx2 + airX
    dy2 = dy2 + g
    bx2 = bx2 - dx2
    by2 = by2 + dy2
    _Display
    _Limit 30
    Circle (oldbx2, oldby2), 5, _RGB(156, 210, 237)
    Paint (oldbx2, oldby2), _RGB(156, 210, 237)
    If Point(bx2, by2) = _RGB32(cl1, cl2, cl3) Then
        mountain = 1
        For explosion = 0 To 20 Step .5
            Circle (bx2, by2), explosion, _RGB32(156, 210, 237)
            Sound 100 + explosion, .25
        Next explosion
    End If
    If bx2 > cbx - 20 And bx2 < cbx + 120 And by2 >= ground Then
        compoints = compoints + 1
        Locate 3, 64: Print "You: "; points; " Computer: "; compoints
        For explosion = 0 To 20 Step .5
            Circle (bx2, by2), explosion, _RGB32(156, 210, 237)
            Sound 100 + explosion, .25
        Next explosion
        For sndd = 500 To 700 Step 50
            Sound sndd, 1
        Next sndd
        mountain = 1
        If compoints = 5 Then Color _RGB(0, 0, 0): Locate 20, 65: Print "COMPUTER WINS!": GoTo asking:
    End If
Loop Until mountain = 1 Or by2 > 700

For ccc = 0 To 7 Step .1
    Line (cbx2, cby2)-(cmx2 - ccc, cmy2), _RGB32(156, 210, 237) 'delete cannon line
Next ccc
mountain = 0
GoTo again:

'This code is used in a few different places in the program.
Wind:
Color _RGB(0, 0, 0)
Locate 1, 73: Print "Wind"
If winddir$ = "West" Then
    Locate 2, 82: Print "                               "
    Locate 2, 59: Print airx2; " mph   "
End If
If winddir$ = "East" Then
    Locate 2, 59: Print "               "
    Locate 2, 82: Print airx2; " mph   "
End If
Locate 2, 68: Print "West <-> East"
Locate 3, 64: Print "You: "; points; " Computer: "; compoints
Locate 4, 71: Print "Level: "; level
Return

asking:
Locate 22, 65: Input "Again? (Yes/No):", ag$
If ag$ = "y" Or ag$ = "Y" Or ag$ = "yes" Or ag$ = "Yes" Or ag$ = "YES" Or ag$ = "yES" Or ag$ = "yeS" Then points = 0: level = 1: GoTo start:
End
Reply
#2
Hi Ken,

Cant do mouse clicks by Point because red is one side, and what if you want to increase?

You have to see if mouse click is inside the boxes. Working... on getting those coodinates.

Also, firstly poll the mouse like this:
Code: (Select All)
While _MouseInput: Wend
mx = _MouseX: my = _MouseY: mb = _MouseButton(1) ' this update the mouse x, y and button status save to variable because they change

You think you need to be in a loop but you don't unless you are doing _mousewheel, which you are not.

BRB
b = b + ...
Reply
#3
Not sure what you mean by "red is one side" both sliders work fine for me. I just can't stop the computer playing the game. Thanks for the While/Wend code, I'll try it out.
Reply
#4
B+, what I do to the red is some red has 1 blue, some have 5 blue, some have 0 blue. The slider has only a certain amount of blue that is used with the mouse. All of the other reds have different numbers of blue. But you can't tell any of it with your eyes.
Reply
#5
Well I got the sliders working, power = vel  0 to 100 and angle a = 0 to 90 what you do after that is on you.

Seems like after computer fires it dies after 3 tries or so???

Here is part I fixed:
Code: (Select All)
'This is the part that I can't fix --------------------------------------------------------

go:
_Display ' update screen !!! sure like to know if my turn or not after computer
fired = 0
While _MouseInput: Wend
mx = _MouseX: my = _MouseY: mb = _MouseButton(1) ' this update the mouse x, y and button status save to variable because they change
If mb Then
    If mx >= 60 And my <= 260 Then
        If my >= 40 And my < 70 Then
            vel = (mx - 60) / 200 * 100  ' converts place in box to 0 to 100

            Line (61, 41)-(259, 69), _RGB32(156, 210, 237), BF
            Line (61, 41)-(mx, 69), _RGB32(255, 0, 1), BF
            'vel = Int(vel2)
            'vel$ = Str$(vel)
            'Line (61, 41)-(vel2, 69), _RGB32(255, 0, 1), BF
            Color _RGB32(0, 0, 0), _RGB32(255, 0, 0)
            _PrintString (265, 50), Str$(vel)
            _Display
            _Delay .25 'wait for release of mouse button
            GoTo go
        ElseIf my >= 70 And my < 100 Then
            a = (mx - 60) / 200 * 90  ' converts place in box to 0 to 90
            'If a2 > 259 Then a2 = 259
            Line (61, 71)-(259, 99), _RGB32(156, 210, 237), BF
            Line (61, 71)-(mx, 99), _RGB32(0, 255, 1), BF
            'a = Int(a2 / 3)
            'aaa$ = Str$(a)
            'Line (61, 71)-(a2, 99), _RGB32(0, 255, 1), BF
            Color _RGB32(0, 0, 0), _RGB32(0, 255, 0)
            _PrintString (265, 80), Str$(a)
            _Display
            _Delay .25 'wait for release of mouse button
            GoTo go
        ElseIf my >= 100 And my < 130 Then
            fired = 1
            GoTo going
        End If
    End If
End If
If fired = 0 Then GoTo go '  need?
b = b + ...
Reply
#6
"I got the sliders themselves working OK"

OK I didn't understand what you were doing. I made the sliders move to any place you click so you don't have to be in red section and drag. Just click a position in the bar.
b = b + ...
Reply
#7
More comments for every line:
Code: (Select All)
go:
_Display ' update screen !!! sure like to know if my turn or not after computer
fired = 0 ' signal the you fired is off
While _MouseInput: Wend
mx = _MouseX: my = _MouseY: mb = _MouseButton(1) ' this updates the mouse x, y and button status save to variable because they change
If mb Then ' do not do anything until mouse is clicked
    If mx >= 60 And my <= 260 Then ' is x in range of the boxes
        If my >= 40 And my < 70 Then ' y inside power
            vel = (mx - 60) / 200 * 100 ' converts place in box to 0 to 100

            Line (61, 41)-(259, 69), _RGB32(156, 210, 237), BF ' clear old line
            Line (61, 41)-(mx, 69), _RGB32(255, 0, 1), BF ' draw new

            'vel = Int(vel2)
            'vel$ = Str$(vel)
            'Line (61, 41)-(vel2, 69), _RGB32(255, 0, 1), BF
            Color _RGB32(0, 0, 0), _RGB32(255, 0, 0)
            _PrintString (265, 50), Str$(vel) ' show power as number
            _Display
            _Delay .25 'wait for release of mouse button
            GoTo go
        ElseIf my >= 70 And my < 100 Then ' y inside angle
            a = (mx - 60) / 200 * 90 ' converts place in box to 0 to 90
            'If a2 > 259 Then a2 = 259
            Line (61, 71)-(259, 99), _RGB32(156, 210, 237), BF ' clear old box
            Line (61, 71)-(mx, 99), _RGB32(0, 255, 1), BF ' draw in new angle
            'a = Int(a2 / 3)
            'aaa$ = Str$(a)
            'Line (61, 71)-(a2, 99), _RGB32(0, 255, 1), BF
            Color _RGB32(0, 0, 0), _RGB32(0, 255, 0)
            _PrintString (265, 80), Str$(a) ' show angle number
            _Display
            _Delay .25 'wait for release of mouse button
            GoTo go
        ElseIf my >= 100 And my < 130 Then ' y inside fire!
            fired = 1 ' you fired!
            _Delay .25 'wait for release of mouse button   <<<<<<< EDIT add this line
            GoTo going
        End If
    End If
End If
If fired = 0 Then GoTo go '  need?  yes try again


OH put a delay after fire too!

crap this dang editor!  insert this after fired = 1

_Delay .25  ' make sure we wait after a mouseclick to give time to user to release the button
_Delay .25 'wait for release of mouse button
b = b + ...
Reply
#8
It looks like when the computer shoots the ball out of the screen it never returns to the player.

Do you check somewhere the ball x coordinate < 0 the computer missed and it's the players turn.
b = b + ...
Reply
#9
B+ I didn't read your last couple of replies and I been working on it all night, so I think I have the game finished now. Tell me what you think and if you find any problems, thanks.

(Code Removed) Go to Page 2 for your updates B+, thanks.
Reply
#10
(05-02-2022, 04:22 AM)bplus Wrote: It looks like when the computer shoots the ball out of the screen it never returns to the player.

Do you check somewhere the ball x coordinate < 0 the computer missed and it's the players turn.

The problem was that I accidentally used the same variable for 2 totally different things, so that is fixed.
Reply




Users browsing this thread: 17 Guest(s)