It was a beautiful sunny weekend, and wife's mandate of father-son bonding was to be obeyed... So, after a bike ride, it's time for some coding. Small Basic, that is.
My little boy has been bugging me about game programming. After some convincing, he settled on Pong, not entirely sure what Pong is.
Having in mind to post the process to the blog, we saved multiple versions of the code, so to show the progress. I think he is still too young to understand version control :)
Version 1:
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make goals, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
'make ball
GraphicsWindow.FillEllipse(345,245,10,10)
'make paddles
GraphicsWindow.FillRectangle(30,220,10,60)
GraphicsWindow.FillRectangle(664,220,10,60)
He did most of the work himself for V1.
It's pretty straightforward. The only question I had for him was why 700x500 for the graphic window. Personally, I'd go with 800x600, or1024x768. You know the whole VGA/SVGA thing :)
His reply was that he always use 700x500 for the graphics window.
One thing worth noting is that BrushColor and PenColor are for difference purposes. The former for filling an object, the latter for drawing an object.
Version 2:
In V2, we added the wall for bouncing from left to right (X coordinates). I gave him the idea that the illusion of a ball moving is achieved by repeatedly drawing and erasing a ball in a new position.
The speed of the ball movement can be adjusted by two factors:
Timer.interval and step size in moving in X direction.
The part of making the ball bounced off the wall seemed like a magic. In reality it is nothing but flipping the corresponding step size (StepX) to the negative.
In fact, I made him to pretend to be a ball, and count out loud the steps, walk towards the wall, and "bouncing" off the wall. After a couple times, he got it :)
' v2
' bounces well, left to right
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make left goal, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
' make right goal, size 100, from (674,200) to (674,300)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
' make paddles
GraphicsWindow.FillRectangle(30,220,10,60)
GraphicsWindow.FillRectangle(664,220,10,60)
' draw ball
Sub DrawBall
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
EndSub
' erase ball
Sub EraseBall
GraphicsWindow.PenWidth = "2"
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawEllipse(BallX,BallY,10,10)
EndSub
' sleep
Timer.Interval = 1
Timer.Tick = RunGame
StepSize = 2
StepX = StepSize
StepY = 0
BallX=345
' BallY=245
BallY=100
LeftWallX = 27
RightWallX = 660
DrawBall()
Sub RunGame
EraseBall()
BallX = BallX + StepX
BallY = BallY + StepY
' Hit right wall
If BallX >= RightWallX Then
StepX = -StepSize
EndIf
' Hit left wall
If BallX <= LeftWallX Then
StepX = StepSize
EndIf
DrawBall()
EndSub
Version 3:
In V3, we handled bouncing the wall up and down. This mirrors what's done in V2, except using StepX as opposed to StepY. When put together, the ball can now bounces off all 4 walls (disregarding the goals and paddles). It almost seemed magical.
' v3
' bounces well, left to right, and up and down.
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make left goal, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
' make right goal, size 100, from (674,200) to (674,300)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
' make paddles
GraphicsWindow.FillRectangle(30,220,10,60)
GraphicsWindow.FillRectangle(664,220,10,60)
' draw ball
Sub DrawBall
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
EndSub
' erase ball
Sub EraseBall
GraphicsWindow.PenWidth = "2"
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawEllipse(BallX,BallY,10,10)
EndSub
' sleep
Timer.Interval = 1
Timer.Tick = RunGame
StepSizeX = 2
StepSizeY = 2
StepX = StepSizeX
StepY = StepSizeY
BallX=345
' BallY=245
BallY=100
' Edges of the 4 walls
LeftWallX = 27
RightWallX = 660
TopWallY = 27
BottomWallY = 460
DrawBall()
Sub RunGame
EraseBall()
' Calculate the new position for ball
BallX = BallX + StepX
BallY = BallY + StepY
' Hit right wall
If BallX >= RightWallX Then
StepX = -StepSizeX
EndIf
' Hit left wall
If BallX <= LeftWallX Then
StepX = StepSizeX
EndIf
' Hit bottom wall
If BallY >= BottomWallY Then
StepY = -StepSizeY
EndIf
' Hit top wall
If BallY <= TopWallY Then
StepY = StepSizeY
EndIf
DrawBall()
EndSub
Version 4:
In V4, we took care of bouncing the ball of paddles.
' v3 - bounces well, left to right, and up and down.
' v4 - bounces off paddles
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make left goal, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
' make right goal, size 100, from (674,200) to (674,300)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
' make paddles
'GraphicsWindow.FillRectangle(30,220,10,60)
'GraphicsWindow.FillRectangle(664,220,10,60)
LeftPaddleX = 30
LeftPaddleY = 220
RightPaddleX = 664
RightPaddleY = 220
' draw left paddle
Sub DrawLeftPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' erase left paddle
Sub EraseLeftPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' draw right paddle
Sub DrawRightPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' erase right paddle
Sub EraseRightPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' draw ball
Sub DrawBall
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
EndSub
' erase ball
Sub EraseBall
GraphicsWindow.PenWidth = "2"
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawEllipse(BallX,BallY,10,10)
EndSub
'' hooking up events
Timer.Interval = 1
Timer.Tick = RunGame
StepSizeX = 2
StepSizeY = 2
StepX = StepSizeX
StepY = StepSizeY
BallX=345
' BallY=245
BallY=245
' Edges of the 4 walls
LeftWallX = 27
RightWallX = 660
TopWallY = 27
BottomWallY = 460
DrawBall()
DrawLeftPaddle()
DrawRightPaddle()
Sub RunGame
EraseBall()
' Calculate the new position for ball
BallX = BallX + StepX
BallY = BallY + StepY
' Hit right wall
If BallX >= RightWallX Then
StepX = -StepSizeX
EndIf
' Hit left wall
If BallX <= LeftWallX Then
StepX = StepSizeX
EndIf
' Hit bottom wall
If BallY >= BottomWallY Then
StepY = -StepSizeY
EndIf
' Hit top wall
If BallY <= TopWallY Then
StepY = StepSizeY
EndIf
' Hit right paddle
If (BallX >= RightPaddleX-12) And (BallY >= RightPaddleY) And (BallY <= RightPaddleY+60) Then
StepX = -StepSizeX
DrawRightPaddle()
EndIf
' Hit left paddle
If (BallX <= LeftPaddleX+12) And (BallY >= LeftPaddleY) And (BallY <= LeftPaddleY+60) Then
StepX = StepSizeX
DrawLeftPaddle()
EndIf
DrawBall()
EndSub
Version 5:
In V5, we made the paddles movable.
The trick here is to add the events to handle key. First we used KeyDown event.
For reasons I don't understand, the little fellow insisted that the left player should use "W" for up and "S" for down, while the right user uses Up Arrow for up, and Down Arrow for down.
During testing, I had this line added to event handler:
GraphicsWindow.Title = "'" + LastKey + "' pressed"
That way, it's easier to tell which key was pressed (or released rather), and what's the corresponding value should be used in the code.
' v3 - bounces well, left to right, and up and down.
' v4 - bounces off paddles
' v5 - paddles can move
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make left goal, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
' make right goal, size 100, from (674,200) to (674,300)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
' make paddles
'GraphicsWindow.FillRectangle(30,220,10,60)
'GraphicsWindow.FillRectangle(664,220,10,60)
LeftPaddleX = 30
LeftPaddleY = 220
RightPaddleX = 664
RightPaddleY = 220
' draw left paddle
Sub DrawLeftPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' erase left paddle
Sub EraseLeftPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' draw right paddle
Sub DrawRightPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' erase right paddle
Sub EraseRightPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' draw ball
Sub DrawBall
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
EndSub
' erase ball
Sub EraseBall
GraphicsWindow.PenWidth = "2"
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawEllipse(BallX,BallY,10,10)
EndSub
'' hooking up events
Timer.Interval = 1
Timer.Tick = RunGame
GraphicsWindow.KeyDown = OnKeyDown
' handle key press, move paddles
Sub OnKeyDown
LastKey = GraphicsWindow.LastKey
GraphicsWindow.Title = "'" + LastKey + "' pressed"
If (LastKey = "W") And (LeftPaddleY >= 31) Then
EraseLeftPaddle()
LeftPaddleY = LeftPaddleY - 10
DrawLeftPaddle()
ElseIf (LastKey = "S") And (LeftPaddleY <= 400) Then
EraseLeftPaddle()
LeftPaddleY = LeftPaddleY + 10
DrawLeftPaddle()
EndIf
If (LastKey = "I") And (RightPaddleY >= 31) Then
EraseRightPaddle()
RightPaddleY = RightPaddleY - 10
DrawRightPaddle()
ElseIf (LastKey = "K") And (RightPaddleY <= 400) Then
EraseRightPaddle()
RightPaddleY = RightPaddleY + 10
DrawRightPaddle()
EndIf
EndSub
StepSizeX = 2
StepSizeY = 2
StepX = StepSizeX
StepY = StepSizeY
BallX=345
' BallY=245
BallY=245
' Edges of the 4 walls
LeftWallX = 27
RightWallX = 660
TopWallY = 27
BottomWallY = 460
DrawBall()
DrawLeftPaddle()
DrawRightPaddle()
Sub RunGame
EraseBall()
' Calculate the new position for ball
BallX = BallX + StepX
BallY = BallY + StepY
' Hit right wall
If BallX >= RightWallX Then
StepX = -StepSizeX
EndIf
' Hit left wall
If BallX <= LeftWallX Then
StepX = StepSizeX
EndIf
' Hit bottom wall
If BallY >= BottomWallY Then
StepY = -StepSizeY
EndIf
' Hit top wall
If BallY <= TopWallY Then
StepY = StepSizeY
EndIf
' Hit right paddle
If (BallX >= RightPaddleX-12) And (BallY >= RightPaddleY) And (BallY <= RightPaddleY+60) Then
StepX = -StepSizeX
DrawRightPaddle()
EndIf
' Hit left paddle
If (BallX <= LeftPaddleX+12) And (BallY >= LeftPaddleY) And (BallY <= LeftPaddleY+60) Then
StepX = StepSizeX
DrawLeftPaddle()
EndIf
DrawBall()
EndSub
Version 6:
In V6, we solved the two-player problem.
We found it to be problematic, when both players try to hold the key down at the same time. The program can only respond to one.
I had the idea of instead to handle KeyUp event. That way it will force players to hit the keys instead of holding the keys down and don't let it go.
' v3 - bounces well, left to right, and up and down.
' v4 - bounces off paddles
'v5 - paddles can move
'v6 - change from KeyDown to KeyUp for two-player mode
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make left goal, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
' make right goal, size 100, from (674,200) to (674,300)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
' make paddles
'GraphicsWindow.FillRectangle(30,220,10,60)
'GraphicsWindow.FillRectangle(664,220,10,60)
LeftPaddleX = 30
LeftPaddleY = 220
RightPaddleX = 664
RightPaddleY = 220
' draw left paddle
Sub DrawLeftPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' erase left paddle
Sub EraseLeftPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' draw right paddle
Sub DrawRightPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' erase right paddle
Sub EraseRightPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' draw ball
Sub DrawBall
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
EndSub
' erase ball
Sub EraseBall
GraphicsWindow.PenWidth = "2"
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawEllipse(BallX,BallY,10,10)
EndSub
'' hooking up events
Timer.Interval = 1
Timer.Tick = RunGame
GraphicsWindow.KeyUp = OnKeyUp
' handle key press, move paddles
Sub OnKeyUp
LastKey = GraphicsWindow.LastKey
GraphicsWindow.Title = "'" + LastKey + "' pressed"
If (LastKey = "W") And (LeftPaddleY >= 31) Then
EraseLeftPaddle()
LeftPaddleY = LeftPaddleY - 10
DrawLeftPaddle()
ElseIf (LastKey = "S") And (LeftPaddleY <= 400) Then
EraseLeftPaddle()
LeftPaddleY = LeftPaddleY + 10
DrawLeftPaddle()
EndIf
If (LastKey = "Up") And (RightPaddleY >= 31) Then
EraseRightPaddle()
RightPaddleY = RightPaddleY - 10
DrawRightPaddle()
ElseIf (LastKey = "Down") And (RightPaddleY <= 400) Then
EraseRightPaddle()
RightPaddleY = RightPaddleY + 10
DrawRightPaddle()
EndIf
EndSub
StepSizeX = 2
StepSizeY = 2
StepX = StepSizeX
StepY = StepSizeY
BallX=345
' BallY=245
BallY=245
' Edges of the 4 walls
LeftWallX = 27
RightWallX = 660
TopWallY = 27
BottomWallY = 460
DrawBall()
DrawLeftPaddle()
DrawRightPaddle()
Sub RunGame
EraseBall()
' Calculate the new position for ball
BallX = BallX + StepX
BallY = BallY + StepY
' Hit right wall
If BallX >= RightWallX Then
StepX = -StepSizeX
EndIf
' Hit left wall
If BallX <= LeftWallX Then
StepX = StepSizeX
EndIf
' Hit bottom wall
If BallY >= BottomWallY Then
StepY = -StepSizeY
EndIf
' Hit top wall
If BallY <= TopWallY Then
StepY = StepSizeY
EndIf
' Hit right paddle
If (BallX >= RightPaddleX-12) And (BallY >= RightPaddleY) And (BallY <= RightPaddleY+60) Then
StepX = -StepSizeX
DrawRightPaddle()
EndIf
' Hit left paddle
If (BallX <= LeftPaddleX+12) And (BallY >= LeftPaddleY) And (BallY <= LeftPaddleY+60) Then
StepX = StepSizeX
DrawLeftPaddle()
EndIf
DrawBall()
EndSub
Version 7:
Finally, in V7, we added additional code to count scores and see who is the winner.
' v3 - bounces well, left to right, and up and down.
' v4 - bounces off paddles
' v5 - paddles can move
' v6 - change from KeyDown to KeyUp for two-player mode
' v7 - count scores
' make background
GraphicsWindow.Width = "700"
GraphicsWindow.Height = "500"
'set pen
GraphicsWindow.PenColor = "gray"
GraphicsWindow.PenWidth = "50"
'draw border
GraphicsWindow.DrawRectangle(0,0,700,500)
' set brush
GraphicsWindow.BrushColor = "white"
' make left goal, size 100, from (0,200) to (0,300)
GraphicsWindow.FillRectangle(0,200,26,100)
' make right goal, size 100, from (674,200) to (674,300)
GraphicsWindow.FillRectangle(674,200,26,100)
' set brush
GraphicsWindow.BrushColor = "black"
' make paddles
'GraphicsWindow.FillRectangle(30,220,10,60)
'GraphicsWindow.FillRectangle(664,220,10,60)
LeftPaddleX = 30
LeftPaddleY = 220
RightPaddleX = 664
RightPaddleY = 220
' draw left paddle
Sub DrawLeftPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' erase left paddle
Sub EraseLeftPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(LeftPaddleX,LeftPaddleY,10,60)
EndSub
' draw right paddle
Sub DrawRightPaddle
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' erase right paddle
Sub EraseRightPaddle
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillRectangle(RightPaddleX,RightPaddleY,10,60)
EndSub
' draw ball
Sub DrawBall
GraphicsWindow.BrushColor = "black"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
EndSub
' erase ball
Sub EraseBall
GraphicsWindow.PenWidth = "2"
GraphicsWindow.BrushColor = "white"
GraphicsWindow.FillEllipse(BallX,BallY,10,10)
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawEllipse(BallX,BallY,10,10)
EndSub
'' hooking up events
Timer.Interval = 1
Timer.Tick = RunGame
GraphicsWindow.KeyUp = OnKeyUp
' handle key press, move paddles
Sub OnKeyUp
LastKey = GraphicsWindow.LastKey
' GraphicsWindow.Title = "'" + LastKey + "' pressed"
If (LastKey = "W") And (LeftPaddleY >= 31) Then
EraseLeftPaddle()
LeftPaddleY = LeftPaddleY - 10
DrawLeftPaddle()
ElseIf (LastKey = "S") And (LeftPaddleY <= 400) Then
EraseLeftPaddle()
LeftPaddleY = LeftPaddleY + 10
DrawLeftPaddle()
EndIf
If (LastKey = "Up") And (RightPaddleY >= 31) Then
EraseRightPaddle()
RightPaddleY = RightPaddleY - 10
DrawRightPaddle()
ElseIf (LastKey = "Down") And (RightPaddleY <= 400) Then
EraseRightPaddle()
RightPaddleY = RightPaddleY + 10
DrawRightPaddle()
EndIf
EndSub
StepSizeX = 2
StepSizeY = 2
StepX = StepSizeX
StepY = StepSizeY
' initial ball position
Sub SetBallToMiddle
BallX=345
BallY=245
EndSub
' Edges of the 4 walls
LeftWallX = 27
RightWallX = 660
TopWallY = 27
BottomWallY = 460
SetBallToMiddle()
DrawBall()
DrawLeftPaddle()
DrawRightPaddle()
GraphicsWindow.Title = "Pong"
' begin scores
leftscore = Controls.AddTextBox(5,1)
rightscore = Controls.AddTextBox(531,1)
mesgboard = Controls.AddTextBox(265,1)
leftscorecount = 0
rightscorecount = 0
Controls.SetTextBoxText(leftscore, leftscorecount)
Controls.SetTextBoxText(rightscore, rightscorecount)
Sub RunGame
EraseBall()
' Calculate the new position for ball
BallX = BallX + StepX
BallY = BallY + StepY
' Hit right wall
If BallX >= RightWallX Then
StepX = -StepSizeX
EndIf
' Hit left wall
If BallX <= LeftWallX Then
StepX = StepSizeX
EndIf
' Hit bottom wall
If BallY >= BottomWallY Then
StepY = -StepSizeY
EndIf
' Hit top wall
If BallY <= TopWallY Then
StepY = StepSizeY
EndIf
' Hit right paddle
If (BallX >= RightPaddleX-12) And (BallY >= RightPaddleY) And (BallY <= RightPaddleY+60) Then
StepX = -StepSizeX
DrawRightPaddle()
EndIf
' Hit left paddle
If (BallX <= LeftPaddleX+12) And (BallY >= LeftPaddleY) And (BallY <= LeftPaddleY+60) Then
StepX = StepSizeX
DrawLeftPaddle()
EndIf
' Hit right goal
If (BallX >= RightWallX) And (BallY > 200) And (BallY < 300) Then
SetBallToMiddle()
DrawBall()
GraphicsWindow.Title = "Left player scored"
leftscorecount = leftscorecount + 1
Controls.SetTextBoxText(leftscore, leftscorecount)
EndIf
' Hit left goal
If (BallX <= LeftWallX) And (BallY > 200) And (BallY < 300) Then
SetBallToMiddle()
DrawBall()
GraphicsWindow.Title = "Right player scored"
rightscorecount = rightscorecount + 1
Controls.SetTextBoxText(rightscore, rightscorecount)
EndIf
DrawBall()
' check who won
If leftscorecount >= 3 Then
Controls.SetTextBoxText(mesgboard, "Left side WON!!!")
TheEnd()
EndIf
If rightscorecount >= 3 Then
Controls.SetTextBoxText(mesgboard, "Right side WON!!!")
TheEnd()
EndIf
EndSub
' End the game
Sub TheEnd
SetBallToMiddle()
StepSizeX = 0
StepSizeY = 0
EndSub
We did all this in about 2 hours, on and off. You know kids attention span is short :)
But the way we did it so that at each iteration something is accomplished was very helpful. I guess you could call that Agile development, another concept I will withhold from him for now :)
We hit a bit of unnecessary complications that I should have thought of to avoid. That is, the width of all objects, including the border, the paddles, and balls.
So, a couple times we will have to erase more than what's drawn. Also, the rendering of animation is not as smooth as we would like. The little one is actually not too surprised. He calls them glitches. Guess got used to from video games.
Overall, it was a good experience for a lazy Sunday afternoon. Priceless :)