Page 1 of 1

WrongfulErrors

Posted: Fri Mar 17, 2006 6:43 pm
by Dark Mars Software
[ERROR]OpenScreen or OpenScreenedWindow must be called before the use of mouse or keyboard commands. However if you look at the code closely i open a window using OpenWindow first and then i call OpenWindowedScreen attaching it to the OpenWindow call first before calling the DemoTimer function.

Code: Select all

Declare TwoPlayerGame()
Declare Timer()
Declare TimeAttackMoveBall()
Declare TimeAttackPrintScore()
Declare TimeAttackGame()
Declare TitleScreen()
Declare ResetScores()
Declare ResetLevel()
Declare PrintScores()
Declare PositionObjects()
Declare Player2Movement()
Declare Player1Movement()
Declare PlayerAI()
Declare OnePlayerGame()
Declare MoveBall()
Declare MountAComebackMod()
Declare MountAComebackGame()
Declare LoadSprites()
Declare LoadSounds()
Declare DemoTimer()
Declare DemoInput()
Declare DemoGame()
Declare ComputerAI()
Declare CleanUp()
Declare CheckForPause()
Declare CheckForMute()
Declare CDPlayer()
Declare BallBouncing()

;Initialize the Keyboard libraries
If InitKeyboard() = 0
  MessageRequester("Error",  "Can't open DirectX 7", 0)
  End
EndIf

Global Mouse_Possible.b

;Initialize the Sound libraries
If InitMouse() = 0
  Mouse_Possible  = 0
Else
  Mouse_Possible  = 1
EndIf

;Initialize the Sprite libraries
If InitSprite() = 0
  MessageRequester("Error",  "Can't open DirectX 7", 0)
  End
EndIf

Global Sound_Possible.b

;Initialize the Sound libraries
If InitSound() = 0
  Sound_Possible  = 0
Else
  Sound_Possible  = 1
EndIf

Global CDPlayback_Possible.b

;Initalize the CDAudio libraries
If InitAudioCD() = 0
  CDPlayback_Possible = 0
  Else
  CDPlayback_Possible = 1
  UseAudioCD(0)
  EndIf

;Use PNG Decoder Library
UsePNGImageDecoder()

;setup the player structure
Structure Player
  X_Position.w
  Y_Position.w
  Score.b
EndStructure

;create player 1 object
Global Player1.Player

;create player 2 object
Global Player2.Player

;setup the ball structure
Structure Ball
  X_Position.w
  Y_Position.w
  X_Velocity.b
  Y_Velocity.b
EndStructure

;crreate ball object
Global Ball.Ball

;player muted sound
Global Mute.b

;CD Playback Variables
Global TotalTracks.b
Global CurrentTrack.b

;used to determine if a game is finished
Global Done.b

;used for the Time Attack Timer
Global Timer.b

;used for the Demo Mode Eclapsed Timer
Global DemoTimer.b

;used as a timer helper
Global lastRunMs.l

;setup load balance variable
Global dynamic_delay_set
dynamic_delay_set  = 50

TitleScreen()

Procedure BallBouncing()
  ;if the ball is at the left edge bounce it off
  If Ball\X_Position  > 432
    Ball\X_Position  = 431
    Ball\X_Velocity  =  - Ball\X_Velocity
  EndIf
  
  ;if the ball is at the right edge bounce it off
  If Ball\X_Position  < 10
    Ball\X_Position  = 11
    Ball\X_Velocity  =  - Ball\X_Velocity
  EndIf
EndProcedure

Procedure CDPlayer()
;if CD Playback is Possible
If CDPlayback_Possible = 1 

;Get the Total Number of Tracks on the CD
TotalTracks = AudioCDTracks()

ExamineKeyboard()

If ((KeyboardPushed(#PB_Key_F5) And (AudioCDStatus() > 0)))
;Decrease the Curent Track
CurrentTrack = CurrentTrack - 1

;if the Current Track is Less Then 1 Which is Not Possible Then Current Track is 1
If CurrentTrack < 1
CurrentTrack = 1
EndIf

PlayAudioCD(CurrentTrack, TotalTracks)
Else
CurrentTrack = CurrentTrack - 1

;if the Current Track is Less Then 1 Which is Not Possible Then Current Track is 1
If CurrentTrack < 1
CurrentTrack = 1
EndIf

EndIf

;If the User Presses F6 and a CD is not Playing Play it From The Current Track
If ((KeyboardPushed(#PB_Key_F6) And (AudioCDStatus() = 0)))
PlayAudioCD(CurrentTrack, TotalTracks)
;Otherwise Stop Playing It
Else
StopAudioCD()
EndIf

;If the User Presses F7 and a CD is not Paused Resume Playing it From The Current Track
If ((KeyboardPushed(#PB_Key_F7) And (AudioCDStatus() = 0)))
ResumeAudioCD()
Else
;Otherwise Pause It
PauseAudioCD()
EndIf


If ((KeyboardPushed(#PB_Key_F8) And (AudioCDStatus() > 0)))
CurrentTrack = CurrentTrack + 1

;if the Current Track is Greater Then The Total Number Of Tracks on The CD
;Which is Not Possible Then Current Track is the Last Track on the CD
If CurrentTrack > TotalTracks
CurrentTrack = TotalTracks
EndIf

PlayAudioCD(CurrentTrack, TotalTracks)
Else
CurrentTrack = CurrentTrack + 1

;if the Current Track is Greater Then The Total Number Of Tracks on The CD
;Which is Not Possible Then Current Track is the Last Track on the CD
If CurrentTrack > TotalTracks
CurrentTrack = TotalTracks
   EndIf
 EndIf
EndIf
EndProcedure

Procedure CheckForMute()
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if either player presses M
  If KeyboardPushed(#PB_Key_M)
    If Mute  = 0
      mute  = 1
    Else
      mute  = 0
    EndIf
  EndIf
EndProcedure

Procedure CheckForPause()
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if either player presses P
  If KeyboardPushed(#PB_Key_P)
    
    ;wait 75ms
    Delay(75)
    
    ;clear the screen to black
    ClearScreen(Black)
    If StartDrawing(ScreenOutput())
      
      ;let the user know the game is paused
      DrawText(300,  100, "Press P to unpause")
      StopDrawing()
      FlipBuffers()
      Repeat
        ExamineKeyboard()
        Delay(75)
        
        ;and wait until the user unpauses it by pressing P again
      Until KeyboardPushed(#PB_Key_P)
    EndIf
  EndIf
EndProcedure

Procedure CleanUp()
  ;The game is finished so remove all the sprites And sounds from memory
  
  ;remove background
  FreeSprite(0)
  
  ;remove player 1's paddles sprite
  FreeSprite(1)
  
  ;remove player'2 paddles sprite
  FreeSprite(2)
  
  ;remove ball sprite
  FreeSprite(3)
  
  ;if no sound was possible then the sound files
  ;weren't loaded and we don't need To unload them.
  If sound_possible  <  > 0
    
    ;remove applause.wav
    FreeSound(0)
    
    ;remove boink1.wav
    FreeSound(1)
    
    ;remove boink2.wav
    FreeSound(2)
    
    ;remove explosion.wav
    FreeSound(3)
  EndIf
EndProcedure

Procedure ComputerAI()
  ;if the ball is to the left of the computers paddle, move the computers paddle left
  If ((Ball\X_Position  < Player2\X_Position) And (Player2\X_Position > 5))
    Player2\X_Position  - 6
  EndIf
  
  ;if the ball is to the right of the computers paddle, move the computers paddle right
  If ((Ball\X_Position  > Player2\X_Position) And (Player2\X_Position < 425))
    Player2\X_Position  + 6
  EndIf

  ;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure DemoGame()
;if a window was successfully opened
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - Demo Mode", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;ResetTheScores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;set done to 0
    Done  = 0
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      BallBouncing()
      MoveBall()
      PlayerAI()
      ComputerAI()
      PrintScores()
      DemoInput()
            
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop check by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure

Procedure DemoInput()
;check for keyboard input
  ExamineKeyboard()
  
  ;if player presses any key
  If KeyboardPushed(#PB_Key_All)
Done = 1
EndIf
EndProcedure

Procedure DemoTimer()
If ElapsedMilliseconds() - lastRunMs  > 1000
    lastRunMs  = ElapsedMilliseconds()
    
    DemoTimer = DemoTimer + 1
    
   ;If no game mode has been seleted for 10 seconds then start demo mode and reset the timer
   If DemoTimer = 30
   DemoTimer = 0
   DemoGame()
    EndIf
  
  ;check for keyboard input
  If ExamineKeyboard()
  
  ;if the user pressed any key
  If KeyboardPushed(#PB_Key_All)
  ;reset the demo timer
  DemoTimer = 0
  EndIf
  
  EndIf
  
  ;check for mouse movement
  If ExamineMouse()
  
  ;If mouse is moved left 
  X_Movement = MouseDeltaX()
  If X_Movement  < 0
  ;Then reset the timer
  DemoTimer = 0
  Else
  ;otherwise If the mouse is moved right
  If X_Movement > 0
  ;Then reset the timer
  DemoTimer = 0
      EndIf
    EndIf
   
   EndIf
  
 EndIf
EndProcedure

Procedure LoadSounds()
  ;if we were able to initalize the sound drivers successfully
  If Sound_Possible  = 1
    
    ;load the sound effect
    LoadSound(0,  "Sound\applause.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(0) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\applause.wav", 0)
      End
    EndIf
    
    ;load the sound effect
    LoadSound(1,  "Sound\boink1.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(1) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\boink1.wav", 0)
      End
    EndIf
    
    ;load the sound effect
    LoadSound(2,  "Sound\boink2.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(2) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\boink2.wav", 0)
      End
    EndIf
    
    ;load the sound effect
    LoadSound(3,  "Sound\explosion.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(3) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\explosion.wav", 0)
      End
    EndIf
  EndIf
EndProcedure

Procedure LoadSprites()
  ;load the background
  LoadSprite(0,  "Sprite\background.png", 0)
  
  ;if the background couldn't be loaded because the file doesn't excist
  If IsSprite(0) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\background.png", 0)
    End
  EndIf
  
  ;load player 1's bat sprite
  LoadSprite(1,  "Sprite\bat1.png", 0)
  
  ;if the sprite couldn't be loaded because the file doesn't excist
  If IsSprite(1) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\bat1.png", 0)
    End
  EndIf
  
  ;otherwise set player 1's sprite initial positions
  Player1\X_Position  = 300
  
  ;load player 2's bat sprite
  LoadSprite(2,  "Sprite\bat2.png", 0)
  
  ;if the sprite couldn't be loaded because the file doesn't excist
  If IsSprite(2) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\bat2.png", 0)
    End
  EndIf
  
  player2\X_Position  = 300
  
  ;load the sprite
  LoadSprite(3,  "Sprite\ball.png", 0)
  
  ;if the sprite couldn't be loaded because the file doesn't excist
  If IsSprite(3) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\ball.png", 0)
    End
  EndIf
  
  ;otherwise set the ball sprite initial position
  Ball\X_Position  = 240
  ball\Y_Position  = 320
  
  ;setup the ball's inital x velocity
  Ball\X_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\X_Velocity = 0
  Ball\X_Velocity = 3
  EndIf
  
  ;setup the ball's inital y velocity
  Ball\Y_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\Y_Velocity = 0
  Ball\Y_Velocity = 3
  EndIf

EndProcedure

Procedure MountAComebackGame()
  ;if a window was opened successfully
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - Mount-A-Comeback", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;Apply Mount-A-Comeback Mod
    MountAComebackMod()
    
    ;Set Done to 0
    Done  = 0
    
    ;Position the Sprites
    PositionObjects()
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      MoveBall()
      Player1Movement()
      ComputerAI()
      PrintScores()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      loopcounter  + 1
      
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;and close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    
    ;otherwise let the user know we couldn't open the game window
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites and sounds from memory
  CleanUp()
EndProcedure

Procedure MountAComebackMod()
  ;Modification Code for Mount-A-Comeback Game
  
  ;set player 1's score to 13
  Player1\Score  = 13
  
  ;set player 2's score to 14
  Player2\Score  = 14
EndProcedure

Procedure MoveBall()
  Ball\X_Position  = Ball\X_Position  + Ball\X_Velocity
  Ball\Y_Position  = Ball\Y_Position  + ball\Y_Velocity
  
  ;if the ball gets past player 2's paddle player 1 scores a point
  If Ball\Y_Position  < 10
    Player1\Score  + 1
    
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball gets past player 1's paddle player 2 scores a point
  If Ball\Y_Position  > 615
    Player2\Score  + 1
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball collides with player 1's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 1, Player1\X_Position, 610)
    Ball\X_Position  = Player1\X_Position  + 10
    Ball\Y_Velocity  =  - Ball\Y_Velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink1.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(1,  0)
    EndIf
    
  EndIf
  
  
  ;if the ball collides with player 2's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 2, Player2\X_Position, 15)
    Ball\X_Position  = Player2\X_position  + 10
    Ball\Y_Velocity  =  - Ball\Y_velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink2.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(2,  0)
    EndIf
    
  EndIf
EndProcedure

Procedure OnePlayerGame()
  ;if a window was successfully opened
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - One Player", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;ResetTheScores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;set done to 0
    Done  = 0
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      MoveBall()
      Player1Movement()
      ComputerAI()
      PrintScores()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop check by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure

Procedure PlayerAI()
;if the ball is to the left of the playerss paddle, move the players paddle left
  If ((Ball\X_Position  < Player1\X_Position) And (Player1\X_Position > 5))
    Player1\X_Position  - 5
  EndIf
  
  ;if the ball is to the right of the players paddle, move the players paddle right
  If ((Ball\X_Position  > Player1\X_Position) And (Player1\X_Position < 425))
    Player1\X_Position  + 5
  EndIf

;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure Player1Movement()
  
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if player 1 presses left
  If KeyboardPushed(#PB_Key_Left)And Player1\X_Position  >  5
    Player1\X_Position  - 5
  EndIf
  
  ;if player 1 presses right
  If KeyboardPushed(#PB_Key_Right)And Player1\X_Position  < 425
    Player1\X_Position  + 5
  EndIf

;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure Player2Movement()
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if player 2 presses left
  If KeyboardPushed(#PB_Key_A)And Player2\X_Position  >  5
    Player2\X_Position  - 5
  EndIf
  
  ;if player 2 presses right
  If KeyboardPushed(#PB_Key_S)And Player2\X_Position  < 425
    Player2\X_Position  + 5
  EndIf
  
  ;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure PositionObjects()
  ;Clear the screen to Black
  ClearScreen(Black)
  
  ;Position The Background
  DisplaySprite(0,  0, 0)
  
  ;Position Player 1's Sprite
  DisplayTransparentSprite(1,  Player1\X_Position, 610)
  
  ;Position Player 2's Sprite
  DisplayTransparentSprite(2,  Player2\X_Position, 15)
  
  ;Position the Ball Sprite
  DisplayTransparentSprite(3,  Ball\X_Position, Ball\Y_Position)
EndProcedure

Procedure PrintScores()
  ;If no one has won print the current scores
  If (Player1\Score  <  > 15)Or (Player2\Score  <  > 15)
    If StartDrawing(ScreenOutput())
      
      ;draw player 1's score at x 400 y 100
      DrawText(400,  100, Str(Player1\Score))
      
      ;draw a dash at x 420 y 100
      DrawText(420,  100, "-")
      
      ;draw player 2's score at x 430 y 100
      DrawText(430,  100, Str(Player2\Score))
      StopDrawing()
    EndIf
  EndIf
  
  ;if Player 1 has won
  If Player1\Score  = 15
    If StartDrawing(ScreenOutput())
      
      ;draw the "Player 1 has won" win message at x 350 y 100
      DrawText(350,  100, "Player 1 has Won")
      StopDrawing()
      
      ;since someone won set done to 1 to close the game window
      Done  = 1
    EndIf
    
    ;Play the Applause.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(0,  0)
    EndIf
    
  EndIf
  
  ;if Player 2 has won
  If Player2\Score  = 15
    If StartDrawing(ScreenOutput())
      
      ;draw the "Player 2 has won" win message at x 350 y 100
      DrawText(350,  100, "Player 2 Has Won")
      StopDrawing()
      
      ;since someone won set done to 1 to close the game window
      Done  = 1
    EndIf
    
    ;Play the Applause.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(0,  0)
    EndIf
    
  EndIf
EndProcedure

Procedure ResetLevel()
  ;reset player 1's paddle sprite position
  Player1\X_Position  = 300
  
  ;reset player 2's paddle sprite position
  Player2\X_Position  = 300
  
  ;reset the ball sprite's x position
  Ball\X_Position  = 240
  
  ;reset the ball sprite's y position
  ball\Y_Position  = 320
  
  ;reset the ball x velocity
  Ball\X_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\X_Velocity = 0
  Ball\X_Velocity = 3
  EndIf
  
  ;reset the ball y velocity
  Ball\Y_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\Y_Velocity = 0
  Ball\Y_Velocity = 3
  EndIf
EndProcedure

Procedure ResetScores()
  ;we're starting a new game so reset player 1's score to 0
  Player1\Score  = 0
  
  ;we're starting a new game so reset player 2's score to 0
  Player2\Score  = 0
EndProcedure

Procedure TitleScreen()
  ;- Window Constants
  ;
  Enumeration
  #MainMenu
  EndEnumeration
  
  ;- Gadget Constants
  ;
  Enumeration
  #OnePlayerGame
  #TwoPlayerGame
  #MountAComeback
  #TimeAttack
  #Quit
  EndEnumeration
  
  ;if the window was opened successfully
  If OpenWindow(#MainMenu, 216, 0, 209, 216, "Pong Master - Main Menu", #PB_Window_SystemMenu  | #PB_Window_TitleBar  | #PB_Window_ScreenCentered)
    
    ;create gadget list
    If CreateGadgetList(WindowID(#MainMenu))
      ButtonGadget(#OnePlayerGame,  10, 10, 180, 30, "1 Player Game")
      ButtonGadget(#TwoPlayerGame,  10, 50, 180, 30, "2 Player Game")
      ButtonGadget(#MountAComeback,  10, 90, 180, 30, "Mount-A-Comeback")
      ButtonGadget(#TimeAttack,  10, 130, 180, 30, "Time Attack")
      ButtonGadget(#Quit,  10, 170, 180, 30, "Quit")
      
    EndIf
  EndIf
  
  Repeat ; Start of the event loop
    
    ;Increment the demo timer
    DemoTimer()
    
    Event  = WaitWindowEvent(1000); This line waits until an event is received from Windows
    
    WindowID  = EventWindow(); The Window where the event is generated, can be used in the gadget procedures
    
    GadgetID  = EventGadget(); Is it a gadget event?
    
    EventType  = EventType(); The event type
    
    ;You can place code here, and use the result as parameters for the procedures
    
    If Event  = #PB_Event_Gadget
      
      ;if the One Player Button was pressed goto OnePlayerGame Procedure
      If GadgetID  = #OnePlayerGame
        OnePlayerGame()
        
        ;if the Two Player Button was pressed goto TwoPlayerGame Procedure
      ElseIf GadgetID  = #TwoPlayerGame
        TwoPlayerGame()
        
        ;if the Mount-A-Comeback Button was pressed goto MountAComeback Procedure
      ElseIf GadgetID  = #MountAComeback
        MountAComebackGame()
        
        ;if the Time Attack Button was pressed goto TimeAttack Procedure
      ElseIf GadgetID  = #TimeAttack
        TimeAttackGame()
        ;if the Quit Button was pressed quit
      ElseIf GadgetID  = #Quit
        End
      EndIf
      
    EndIf
    
  Until Event  = #PB_Event_CloseWindow ; End of the event loop
EndProcedure

Procedure TimeAttackGame()
  ;if a window was successfully opened
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - One Player", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;ResetTheScores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;set done to 0
    Done  = 0
    
    Timer  = 120
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      TimeAttackMoveBall()
      Player1Movement()
      ComputerAI()
      Timer()
      TimeAttackPrintScore()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop check by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure

Procedure TimeAttackPrintScore()
  ;If the time has not run out print the current score
  If Timer  <  > 0
    If StartDrawing(ScreenOutput())
      
      ;draw the placeholder "Score" at x 400 y 100
      DrawText(400,  100, "Score:")
      
      ;draw player 1's score at x 420 y 100
      DrawText(450,  100, Str(Player1\Score))
      
      ;draw the placeholder "Time:" at x 400 y 120
      DrawText(400,  120, "Time:")
      
      ;draw the cutrrent time limit at x 420 y 120
      DrawText(440,  120, Str(Timer))
      
      StopDrawing()
    EndIf
  EndIf
  
  If Timer  = 0
    
    If StartDrawing(ScreenOutput())
      
      ;draw the placeholder "Score" at x 400 y 100
      DrawText(400,  100, "Score:")
      
      ;draw player 1's score at x 420 y 100
      DrawText(420,  100, Str(Player1\Score))
      
      ;draw the placeholder "Time:" at x 400 y 120
      DrawText(400,  120, "Time:")
      
      ;draw the "Time's Up" message at x 420 y 120
      DrawText(420,  120, "Times Up")
      
      StopDrawing()
    EndIf
  EndIf
  
EndProcedure

Procedure TimeAttackMoveBall()
  Ball\X_Position  = Ball\X_Position  + Ball\X_Velocity
  Ball\Y_Position  = Ball\Y_Position  + ball\Y_Velocity
  
  ;if the ball gets past player 2's paddle player 1 scores a point
  If Ball\Y_Position  < 10
    Player1\Score  + 1
    
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball gets past player 1's paddle player 2 scores a point
  If Ball\Y_Position  > 615
    Player1\Score  - 1
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball collides with player 1's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 1, Player1\X_Position, 610)
    Ball\X_Position  = Player1\X_Position  + 10
    Ball\Y_Velocity  =  - Ball\Y_Velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink1.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(1,  0)
    EndIf
    
  EndIf
  
  
  ;if the ball collides with player 2's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 2, Player2\X_Position, 15)
    Ball\X_Position  = Player2\X_position  + 10
    Ball\Y_Velocity  =  - Ball\Y_velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink2.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(2,  0)
    EndIf
    
  EndIf
EndProcedure

Procedure Timer()
  If ElapsedMilliseconds() - lastRunMs  > 1000
    lastRunMs  = ElapsedMilliseconds()
    Timer  - 1
    
    ;If the Users Time Attack Timer Has Expired
    If Timer  = 0
      Done  = 1
    
    ;Play the Explosion.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(3,  0)
    EndIf
    
    EndIf
  
  EndIf
EndProcedure

Procedure TwoPlayerGame()
  ;If the window was opened successfully
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - Two Player", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;Reset The Scores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;Set Done to 0
    Done  = 0
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      MoveBall()
      Player1Movement()
      Player2Movement()
      PrintScores()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop counter by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;and close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the title screen
    TitleScreen()
    
  Else
    
    ;otherwise let the user know the window couldn't be opened
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure
;ExecutableFormat=Windows
;Executable=C:\Projects\Pong Master - Pure BASIC\Pong Master.exe
;EOF
Heres the code that shows me opening a window as stated above:

Code: Select all

Procedure TitleScreen()
;- Window Constants
  ;
  Enumeration
  #MainMenu
  EndEnumeration
  
  ;- Gadget Constants
  ;
  Enumeration
  #OnePlayerGame
  #TwoPlayerGame
  #MountAComeback
  #TimeAttack
  #Quit
  EndEnumeration
  
  ;if the window was opened successfully  
If OpenWindow(#MainMenu, 216, 0, 209, 216, "Pong Master - Main Menu", #PB_Window_SystemMenu  | #PB_Window_TitleBar  | #PB_Window_ScreenCentered)
    
    ;create gadget list
    If CreateGadgetList(WindowID(#MainMenu))
      ButtonGadget(#OnePlayerGame,  10, 10, 180, 30, "1 Player Game")
      ButtonGadget(#TwoPlayerGame,  10, 50, 180, 30, "2 Player Game")
      ButtonGadget(#MountAComeback,  10, 90, 180, 30, "Mount-A-Comeback")
      ButtonGadget(#TimeAttack,  10, 130, 180, 30, "Time Attack")
      ButtonGadget(#Quit,  10, 170, 180, 30, "Quit")
      
    EndIf
  EndIf
  
  Repeat ; Start of the event loop
    
    ;Increment the demo timer
    DemoTimer()
    
    Event  = WaitWindowEvent(1000); This line waits until an event is received from Windows
    
    WindowID  = EventWindow(); The Window where the event is generated, can be used in the gadget procedures
    
    GadgetID  = EventGadget(); Is it a gadget event?
    
    EventType  = EventType(); The event type
    
    ;You can place code here, and use the result as parameters for the procedures
    
    If Event  = #PB_Event_Gadget
      
      ;if the One Player Button was pressed goto OnePlayerGame Procedure
      If GadgetID  = #OnePlayerGame
        OnePlayerGame()
        
        ;if the Two Player Button was pressed goto TwoPlayerGame Procedure
      ElseIf GadgetID  = #TwoPlayerGame
        TwoPlayerGame()
        
        ;if the Mount-A-Comeback Button was pressed goto MountAComeback Procedure
      ElseIf GadgetID  = #MountAComeback
        MountAComebackGame()
        
        ;if the Time Attack Button was pressed goto TimeAttack Procedure
      ElseIf GadgetID  = #TimeAttack
        TimeAttackGame()
        ;if the Quit Button was pressed quit
      ElseIf GadgetID  = #Quit
        End
      EndIf
      
    EndIf
    
  Until Event  = #PB_Event_CloseWindow ; End of the event loop
EndProcedure
And here is where the error occurs:

Code: Select all

Procedure DemoTimer()
If ElapsedMilliseconds() - lastRunMs  > 1000
    lastRunMs  = ElapsedMilliseconds()
    
    DemoTimer = DemoTimer + 1
    
   ;If no game mode has been seleted for 10 seconds then start demo mode and reset the timer
   If DemoTimer = 30
   DemoTimer = 0
   DemoGame()
    EndIf
  
  ;check for keyboard input
  If ExamineKeyboard()
  
  ;if the user pressed any key
  If KeyboardPushed(#PB_Key_All)
  ;reset the demo timer
  DemoTimer = 0
  EndIf
  
  EndIf
  
  ;check for mouse movement
  If ExamineMouse()
  
  ;If mouse is moved left 
  X_Movement = MouseDeltaX()
  If X_Movement  < 0
  ;Then reset the timer
  DemoTimer = 0
  Else
  ;otherwise If the mouse is moved right
  If X_Movement > 0
  ;Then reset the timer
  DemoTimer = 0
      EndIf
    EndIf
   
   EndIf
  
 EndIf
EndProcedure

Posted: Sat Mar 18, 2006 1:32 am
by Dark Mars Software
Can someone please help me out?

Posted: Sat Mar 18, 2006 1:40 am
by PB
> Can someone please help me out?

I looked briefly at your code and it needs wav files and so on... maybe give
a link of the zipped source with all required files and I'd be more inclined to
look into it. As it stands, it's too much hassle to bother with. You gotta make
it simple for people, instead of making them go looking for files to test it with.

Posted: Sat Mar 18, 2006 1:59 am
by Dark Mars Software
The link in my sig pints to the current stable release, which includes all the files. Just unzip it and overwrite the source file with this one.

Posted: Sat Mar 18, 2006 8:17 am
by Comtois
I just added this in the procedure TitleScreen , and it work.

Code: Select all

  ;if the window was opened successfully
  If OpenWindow(#MainMenu, 216, 0, 209, 216, "Pong Master - Main Menu", #PB_Window_SystemMenu  | #PB_Window_TitleBar  | #PB_Window_ScreenCentered)
      OpenWindowedScreen(WindowID(#MainMenu),0,0,209,216,1,0,0)    ; <<<< Added 
    ;create gadget list

Posted: Sat Mar 18, 2006 7:51 pm
by Dark Mars Software
Works,

but now the mouse cursor disappears making it hard to see what selection you are making. I managed to trace it to the DemoTimer() function. Also the mouse movement detection isn't working for some reason.

Code: Select all

Declare TwoPlayerGame()
Declare Timer()
Declare TimeAttackMoveBall()
Declare TimeAttackPrintScore()
Declare TimeAttackGame()
Declare TitleScreen()
Declare ResetScores()
Declare ResetLevel()
Declare PrintScores()
Declare PositionObjects()
Declare Player2Movement()
Declare Player1Movement()
Declare PlayerAI()
Declare OnePlayerGame()
Declare MoveBall()
Declare MountAComebackMod()
Declare MountAComebackGame()
Declare LoadSprites()
Declare LoadSounds()
Declare DemoTimer()
Declare DemoInput()
Declare DemoGame()
Declare ComputerAI()
Declare CleanUp()
Declare CheckForPause()
Declare CheckForMute()
Declare CDPlayer()
Declare BallBouncing()

;Initialize the Keyboard libraries
If InitKeyboard() = 0
  MessageRequester("Error",  "Can't open DirectX 7", 0)
  End
EndIf

Global Mouse_Possible.b

;Initialize the Sound libraries
If InitMouse() = 0
  Mouse_Possible  = 0
Else
  Mouse_Possible  = 1
EndIf

;Initialize the Sprite libraries
If InitSprite() = 0
  MessageRequester("Error",  "Can't open DirectX 7", 0)
  End
EndIf

Global Sound_Possible.b

;Initialize the Sound libraries
If InitSound() = 0
  Sound_Possible  = 0
Else
  Sound_Possible  = 1
EndIf

Global CDPlayback_Possible.b

;Initalize the CDAudio libraries
If InitAudioCD() = 0
  CDPlayback_Possible = 0
  Else
  CDPlayback_Possible = 1
  UseAudioCD(0)
  EndIf

;Use PNG Decoder Library
UsePNGImageDecoder()

;setup the player structure
Structure Player
  X_Position.w
  Y_Position.w
  Score.b
EndStructure

;create player 1 object
Global Player1.Player

;create player 2 object
Global Player2.Player

;setup the ball structure
Structure Ball
  X_Position.w
  Y_Position.w
  X_Velocity.b
  Y_Velocity.b
EndStructure

;crreate ball object
Global Ball.Ball

;player muted sound
Global Mute.b

;CD Playback Variables
Global TotalTracks.b
Global CurrentTrack.b

;used to determine if a game is finished
Global Done.b

;used for the Time Attack Timer
Global Timer.b

;used for the Demo Mode Eclapsed Timer
Global DemoTimer.b

;Mouse Detection Variables
Global X_Movement

;used as a timer helper
Global lastRunMs.l

;setup load balance variable
Global dynamic_delay_set
dynamic_delay_set  = 50

TitleScreen()

Procedure BallBouncing()
  ;if the ball is at the left edge bounce it off
  If Ball\X_Position  > 432
    Ball\X_Position  = 431
    Ball\X_Velocity  =  - Ball\X_Velocity
  EndIf
  
  ;if the ball is at the right edge bounce it off
  If Ball\X_Position  < 10
    Ball\X_Position  = 11
    Ball\X_Velocity  =  - Ball\X_Velocity
  EndIf
EndProcedure

Procedure CDPlayer()
;if CD Playback is Possible
If CDPlayback_Possible = 1 

;Get the Total Number of Tracks on the CD
TotalTracks = AudioCDTracks()

ExamineKeyboard()

If ((KeyboardPushed(#PB_Key_F5) And (AudioCDStatus() > 0)))
;Decrease the Curent Track
CurrentTrack = CurrentTrack - 1

;if the Current Track is Less Then 1 Which is Not Possible Then Current Track is 1
If CurrentTrack < 1
CurrentTrack = 1
EndIf

PlayAudioCD(CurrentTrack, TotalTracks)
Else
CurrentTrack = CurrentTrack - 1

;if the Current Track is Less Then 1 Which is Not Possible Then Current Track is 1
If CurrentTrack < 1
CurrentTrack = 1
EndIf

EndIf

;If the User Presses F6 and a CD is not Playing Play it From The Current Track
If ((KeyboardPushed(#PB_Key_F6) And (AudioCDStatus() = 0)))
PlayAudioCD(CurrentTrack, TotalTracks)
;Otherwise Stop Playing It
Else
StopAudioCD()
EndIf

;If the User Presses F7 and a CD is not Paused Resume Playing it From The Current Track
If ((KeyboardPushed(#PB_Key_F7) And (AudioCDStatus() = 0)))
ResumeAudioCD()
Else
;Otherwise Pause It
PauseAudioCD()
EndIf


If ((KeyboardPushed(#PB_Key_F8) And (AudioCDStatus() > 0)))
CurrentTrack = CurrentTrack + 1

;if the Current Track is Greater Then The Total Number Of Tracks on The CD
;Which is Not Possible Then Current Track is the Last Track on the CD
If CurrentTrack > TotalTracks
CurrentTrack = TotalTracks
EndIf

PlayAudioCD(CurrentTrack, TotalTracks)
Else
CurrentTrack = CurrentTrack + 1

;if the Current Track is Greater Then The Total Number Of Tracks on The CD
;Which is Not Possible Then Current Track is the Last Track on the CD
If CurrentTrack > TotalTracks
CurrentTrack = TotalTracks
   EndIf
 EndIf
EndIf
EndProcedure

Procedure CheckForMute()
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if either player presses M
  If KeyboardPushed(#PB_Key_M)
    If Mute  = 0
      mute  = 1
    Else
      mute  = 0
    EndIf
  EndIf
EndProcedure

Procedure CheckForPause()
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if either player presses P
  If KeyboardPushed(#PB_Key_P)
    
    ;wait 75ms
    Delay(75)
    
    ;clear the screen to black
    ClearScreen(Black)
    If StartDrawing(ScreenOutput())
      
      ;let the user know the game is paused
      DrawText(300,  100, "Press P to unpause")
      StopDrawing()
      FlipBuffers()
      Repeat
        ExamineKeyboard()
        Delay(75)
        
        ;and wait until the user unpauses it by pressing P again
      Until KeyboardPushed(#PB_Key_P)
    EndIf
  EndIf
EndProcedure

Procedure CleanUp()
  ;The game is finished so remove all the sprites And sounds from memory
  
  ;remove background
  FreeSprite(0)
  
  ;remove player 1's paddles sprite
  FreeSprite(1)
  
  ;remove player'2 paddles sprite
  FreeSprite(2)
  
  ;remove ball sprite
  FreeSprite(3)
  
  ;if no sound was possible then the sound files
  ;weren't loaded and we don't need To unload them.
  If sound_possible  <  > 0
    
    ;remove applause.wav
    FreeSound(0)
    
    ;remove boink1.wav
    FreeSound(1)
    
    ;remove boink2.wav
    FreeSound(2)
    
    ;remove explosion.wav
    FreeSound(3)
  EndIf
EndProcedure

Procedure ComputerAI()
  ;if the ball is to the left of the computers paddle, move the computers paddle left
  If ((Ball\X_Position  < Player2\X_Position) And (Player2\X_Position > 5))
    Player2\X_Position  - 6
  EndIf
  
  ;if the ball is to the right of the computers paddle, move the computers paddle right
  If ((Ball\X_Position  > Player2\X_Position) And (Player2\X_Position < 425))
    Player2\X_Position  + 6
  EndIf

  ;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure DemoGame()
;if a window was successfully opened
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - Demo Mode", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;ResetTheScores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;set done to 0
    Done  = 0
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      BallBouncing()
      MoveBall()
      PlayerAI()
      ComputerAI()
      PrintScores()
      DemoInput()
            
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop check by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure

Procedure DemoInput()
;check for keyboard input
  ExamineKeyboard()
  
  ;if player presses any key
  If KeyboardPushed(#PB_Key_All)
Done = 1
EndIf
  
 ;check for mouse movement
 If ExamineMouse()
  
  ;If mouse is moved left 
 X_Movement = MouseDeltaX()
  If X_Movement  < 0
  ;Then reset the timer
  Done = 1
  Else
  ;otherwise If the mouse is moved right
  If Y_Movement > 0
  ;Then reset the timer
  Done = 1
      EndIf
    EndIf
 EndIf



EndProcedure

Procedure DemoTimer()
If ElapsedMilliseconds() - lastRunMs  > 1000
    lastRunMs  = ElapsedMilliseconds()
    
    DemoTimer = DemoTimer + 1
    
   ;If no game mode has been seleted for 10 seconds then start demo mode and reset the timer
   If DemoTimer = 15
   DemoTimer = 0
   DemoGame()
    EndIf
  
  ;check for keyboard input
  If ExamineKeyboard()
  
  ;if the user pressed any key
  If KeyboardPushed(#PB_Key_All)
  ;reset the demo timer
  DemoTimer = 0
  EndIf
  
  EndIf
  
  ;check for mouse movement
  ExamineMouse()
  
  ;If mouse is moved left 
  X_Movement = MouseDeltaX()
  If X_Movement  < 0
  ;Then reset the timer
  DemoTimer = 0
  Else
  ;otherwise If the mouse is moved right
  If X_Movement > 0
  ;Then reset the timer
  DemoTimer = 0
      EndIf
    EndIf
   EndIf
 Debug X_Movement
EndProcedure

Procedure LoadSounds()
  ;if we were able to initalize the sound drivers successfully
  If Sound_Possible  = 1
    
    ;load the sound effect
    LoadSound(0,  "Sound\applause.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(0) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\applause.wav", 0)
      End
    EndIf
    
    ;load the sound effect
    LoadSound(1,  "Sound\boink1.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(1) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\boink1.wav", 0)
      End
    EndIf
    
    ;load the sound effect
    LoadSound(2,  "Sound\boink2.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(2) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\boink2.wav", 0)
      End
    EndIf
    
    ;load the sound effect
    LoadSound(3,  "Sound\explosion.wav")
    
    ;if the sound effect couldn't be loaded because the file doesn't excist
    If IsSound(3) = 0
      
      ;give an error message and quit
      MessageRequester("Error",  "Can't open Sound\explosion.wav", 0)
      End
    EndIf
  EndIf
EndProcedure

Procedure LoadSprites()
  ;load the background
  LoadSprite(0,  "Sprite\background.png", 0)
  
  ;if the background couldn't be loaded because the file doesn't excist
  If IsSprite(0) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\background.png", 0)
    End
  EndIf
  
  ;load player 1's bat sprite
  LoadSprite(1,  "Sprite\bat1.png", 0)
  
  ;if the sprite couldn't be loaded because the file doesn't excist
  If IsSprite(1) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\bat1.png", 0)
    End
  EndIf
  
  ;otherwise set player 1's sprite initial positions
  Player1\X_Position  = 300
  
  ;load player 2's bat sprite
  LoadSprite(2,  "Sprite\bat2.png", 0)
  
  ;if the sprite couldn't be loaded because the file doesn't excist
  If IsSprite(2) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\bat2.png", 0)
    End
  EndIf
  
  player2\X_Position  = 300
  
  ;load the sprite
  LoadSprite(3,  "Sprite\ball.png", 0)
  
  ;if the sprite couldn't be loaded because the file doesn't excist
  If IsSprite(3) = 0
    
    ;give an error message and quit
    MessageRequester("Error",  "Can't open Sprite\ball.png", 0)
    End
  EndIf
  
  ;otherwise set the ball sprite initial position
  Ball\X_Position  = 240
  ball\Y_Position  = 320
  
  ;setup the ball's inital x velocity
  Ball\X_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\X_Velocity = 0
  Ball\X_Velocity = 3
  EndIf
  
  ;setup the ball's inital y velocity
  Ball\Y_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\Y_Velocity = 0
  Ball\Y_Velocity = 3
  EndIf

EndProcedure

Procedure MountAComebackGame()
  ;if a window was opened successfully
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - Mount-A-Comeback", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;Apply Mount-A-Comeback Mod
    MountAComebackMod()
    
    ;Set Done to 0
    Done  = 0
    
    ;Position the Sprites
    PositionObjects()
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      MoveBall()
      Player1Movement()
      ComputerAI()
      PrintScores()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      loopcounter  + 1
      
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;and close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    
    ;otherwise let the user know we couldn't open the game window
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites and sounds from memory
  CleanUp()
EndProcedure

Procedure MountAComebackMod()
  ;Modification Code for Mount-A-Comeback Game
  
  ;set player 1's score to 13
  Player1\Score  = 13
  
  ;set player 2's score to 14
  Player2\Score  = 14
EndProcedure

Procedure MoveBall()
  Ball\X_Position  = Ball\X_Position  + Ball\X_Velocity
  Ball\Y_Position  = Ball\Y_Position  + ball\Y_Velocity
  
  ;if the ball gets past player 2's paddle player 1 scores a point
  If Ball\Y_Position  < 10
    Player1\Score  + 1
    
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball gets past player 1's paddle player 2 scores a point
  If Ball\Y_Position  > 615
    Player2\Score  + 1
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball collides with player 1's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 1, Player1\X_Position, 610)
    Ball\X_Position  = Player1\X_Position  + 10
    Ball\Y_Velocity  =  - Ball\Y_Velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink1.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(1,  0)
    EndIf
    
  EndIf
  
  
  ;if the ball collides with player 2's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 2, Player2\X_Position, 15)
    Ball\X_Position  = Player2\X_position  + 10
    Ball\Y_Velocity  =  - Ball\Y_velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink2.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(2,  0)
    EndIf
    
  EndIf
EndProcedure

Procedure OnePlayerGame()
  ;if a window was successfully opened
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - One Player", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;ResetTheScores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;set done to 0
    Done  = 0
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      MoveBall()
      Player1Movement()
      ComputerAI()
      PrintScores()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop check by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure

Procedure PlayerAI()
;if the ball is to the left of the playerss paddle, move the players paddle left
  If ((Ball\X_Position  < Player1\X_Position) And (Player1\X_Position > 5))
    Player1\X_Position  - 5
  EndIf
  
  ;if the ball is to the right of the players paddle, move the players paddle right
  If ((Ball\X_Position  > Player1\X_Position) And (Player1\X_Position < 425))
    Player1\X_Position  + 5
  EndIf

;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure Player1Movement()
  
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if player 1 presses left
  If KeyboardPushed(#PB_Key_Left)And Player1\X_Position  >  5
    Player1\X_Position  - 5
  EndIf
  
  ;if player 1 presses right
  If KeyboardPushed(#PB_Key_Right)And Player1\X_Position  < 425
    Player1\X_Position  + 5
  EndIf

;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure Player2Movement()
  ;check for keyboard input
  ExamineKeyboard()
  
  ;if player 2 presses left
  If KeyboardPushed(#PB_Key_A)And Player2\X_Position  >  5
    Player2\X_Position  - 5
  EndIf
  
  ;if player 2 presses right
  If KeyboardPushed(#PB_Key_S)And Player2\X_Position  < 425
    Player2\X_Position  + 5
  EndIf
  
  ;Update the Game Screen
  PositionObjects()
EndProcedure

Procedure PositionObjects()
  ;Clear the screen to Black
  ClearScreen(Black)
  
  ;Position The Background
  DisplaySprite(0,  0, 0)
  
  ;Position Player 1's Sprite
  DisplayTransparentSprite(1,  Player1\X_Position, 610)
  
  ;Position Player 2's Sprite
  DisplayTransparentSprite(2,  Player2\X_Position, 15)
  
  ;Position the Ball Sprite
  DisplayTransparentSprite(3,  Ball\X_Position, Ball\Y_Position)
EndProcedure

Procedure PrintScores()
  ;If no one has won print the current scores
  If (Player1\Score  <  > 15)Or (Player2\Score  <  > 15)
    If StartDrawing(ScreenOutput())
      
      ;draw player 1's score at x 400 y 100
      DrawText(400,  100, Str(Player1\Score))
      
      ;draw a dash at x 420 y 100
      DrawText(420,  100, "-")
      
      ;draw player 2's score at x 430 y 100
      DrawText(430,  100, Str(Player2\Score))
      StopDrawing()
    EndIf
  EndIf
  
  ;if Player 1 has won
  If Player1\Score  = 15
    If StartDrawing(ScreenOutput())
      
      ;draw the "Player 1 has won" win message at x 350 y 100
      DrawText(350,  100, "Player 1 has Won")
      StopDrawing()
      
      ;since someone won set done to 1 to close the game window
      Done  = 1
    EndIf
    
    ;Play the Applause.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(0,  0)
    EndIf
    
  EndIf
  
  ;if Player 2 has won
  If Player2\Score  = 15
    If StartDrawing(ScreenOutput())
      
      ;draw the "Player 2 has won" win message at x 350 y 100
      DrawText(350,  100, "Player 2 Has Won")
      StopDrawing()
      
      ;since someone won set done to 1 to close the game window
      Done  = 1
    EndIf
    
    ;Play the Applause.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(0,  0)
    EndIf
    
  EndIf
EndProcedure

Procedure ResetLevel()
  ;reset player 1's paddle sprite position
  Player1\X_Position  = 300
  
  ;reset player 2's paddle sprite position
  Player2\X_Position  = 300
  
  ;reset the ball sprite's x position
  Ball\X_Position  = 240
  
  ;reset the ball sprite's y position
  ball\Y_Position  = 320
  
  ;reset the ball x velocity
  Ball\X_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\X_Velocity = 0
  Ball\X_Velocity = 3
  EndIf
  
  ;reset the ball y velocity
  Ball\Y_Velocity  = (Random(-3) - Random(3))
  
  ;if the balls x velocity is 0 make it equal To 3
  If Ball\Y_Velocity = 0
  Ball\Y_Velocity = 3
  EndIf
EndProcedure

Procedure ResetScores()
  ;we're starting a new game so reset player 1's score to 0
  Player1\Score  = 0
  
  ;we're starting a new game so reset player 2's score to 0
  Player2\Score  = 0
EndProcedure

Procedure TitleScreen()
  ;- Window Constants
  ;
  Enumeration
  #MainMenu
  EndEnumeration
  
  ;- Gadget Constants
  ;
  Enumeration
  #OnePlayerGame
  #TwoPlayerGame
  #MountAComeback
  #TimeAttack
  #Quit
  EndEnumeration
  
  ;if the window was opened successfully
  If OpenWindow(#MainMenu, 216, 0, 209, 216, "Pong Master - Main Menu", #PB_Window_SystemMenu  | #PB_Window_TitleBar  | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(#MainMenu),0,0,209,216,1,0,0)
    
    ;create gadget list
    If CreateGadgetList(WindowID(#MainMenu))
      ButtonGadget(#OnePlayerGame,  10, 10, 180, 30, "1 Player Game")
      ButtonGadget(#TwoPlayerGame,  10, 50, 180, 30, "2 Player Game")
      ButtonGadget(#MountAComeback,  10, 90, 180, 30, "Mount-A-Comeback")
      ButtonGadget(#TimeAttack,  10, 130, 180, 30, "Time Attack")
      ButtonGadget(#Quit,  10, 170, 180, 30, "Quit")
      
    EndIf
  EndIf
  
  Repeat ; Start of the event loop
    
    Event  = WaitWindowEvent(1000); This line waits until an event is received from Windows
    
    WindowID  = EventWindow(); The Window where the event is generated, can be used in the gadget procedures
    
    GadgetID  = EventGadget(); Is it a gadget event?
    
    EventType  = EventType(); The event type
    
    ;Increment the demo timer
    DemoTimer()
    
    ;You can place code here, and use the result as parameters for the procedures
    
    If Event  = #PB_Event_Gadget
      
      ;if the One Player Button was pressed goto OnePlayerGame Procedure
      If GadgetID  = #OnePlayerGame
        OnePlayerGame()
        
        ;if the Two Player Button was pressed goto TwoPlayerGame Procedure
      ElseIf GadgetID  = #TwoPlayerGame
        TwoPlayerGame()
        
        ;if the Mount-A-Comeback Button was pressed goto MountAComeback Procedure
      ElseIf GadgetID  = #MountAComeback
        MountAComebackGame()
        
        ;if the Time Attack Button was pressed goto TimeAttack Procedure
      ElseIf GadgetID  = #TimeAttack
        TimeAttackGame()
        ;if the Quit Button was pressed quit
      ElseIf GadgetID  = #Quit
        End
      EndIf
    
    EndIf
    
  Until Event  = #PB_Event_CloseWindow ; End of the event loop
EndProcedure

Procedure TimeAttackGame()
  ;if a window was successfully opened
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - One Player", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;ResetTheScores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;set done to 0
    Done  = 0
    
    Timer  = 120
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      TimeAttackMoveBall()
      Player1Movement()
      ComputerAI()
      Timer()
      TimeAttackPrintScore()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop check by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the titlescreen
    TitleScreen()
    
  Else
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure

Procedure TimeAttackPrintScore()
  ;If the time has not run out print the current score
  If Timer  <  > 0
    If StartDrawing(ScreenOutput())
      
      ;draw the placeholder "Score" at x 400 y 100
      DrawText(400,  100, "Score:")
      
      ;draw player 1's score at x 420 y 100
      DrawText(450,  100, Str(Player1\Score))
      
      ;draw the placeholder "Time:" at x 400 y 120
      DrawText(400,  120, "Time:")
      
      ;draw the cutrrent time limit at x 420 y 120
      DrawText(440,  120, Str(Timer))
      
      StopDrawing()
    EndIf
  EndIf
  
  If Timer  = 0
    
    If StartDrawing(ScreenOutput())
      
      ;draw the placeholder "Score" at x 400 y 100
      DrawText(400,  100, "Score:")
      
      ;draw player 1's score at x 420 y 100
      DrawText(420,  100, Str(Player1\Score))
      
      ;draw the placeholder "Time:" at x 400 y 120
      DrawText(400,  120, "Time:")
      
      ;draw the "Time's Up" message at x 420 y 120
      DrawText(420,  120, "Times Up")
      
      StopDrawing()
    EndIf
  EndIf
  
EndProcedure

Procedure TimeAttackMoveBall()
  Ball\X_Position  = Ball\X_Position  + Ball\X_Velocity
  Ball\Y_Position  = Ball\Y_Position  + ball\Y_Velocity
  
  ;if the ball gets past player 2's paddle player 1 scores a point
  If Ball\Y_Position  < 10
    Player1\Score  + 1
    
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball gets past player 1's paddle player 2 scores a point
  If Ball\Y_Position  > 615
    Player1\Score  - 1
    ;and reset all the sprites position
    ResetLevel()
  EndIf
  
  ;if the ball collides with player 1's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 1, Player1\X_Position, 610)
    Ball\X_Position  = Player1\X_Position  + 10
    Ball\Y_Velocity  =  - Ball\Y_Velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink1.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(1,  0)
    EndIf
    
  EndIf
  
  
  ;if the ball collides with player 2's paddle, bounce the ball off it
  If SpriteCollision(3, Ball\X_Position, Ball\Y_Position, 2, Player2\X_Position, 15)
    Ball\X_Position  = Player2\X_position  + 10
    Ball\Y_Velocity  =  - Ball\Y_velocity
    
    ;increase the ball's x velocity
    If Ball\X_Velocity  < 0
      Ball\X_Velocity  - 1
    Else
      Ball\X_Velocity  + 1
    EndIf
    
    ;increase the ball's y velocity
    If Ball\Y_Velocity  < 0
      Ball\Y_Velocity  - 1
    Else
      Ball\Y_Velocity  + 1
    EndIf
    
    ;Play the Boink2.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(2,  0)
    EndIf
    
  EndIf
EndProcedure

Procedure Timer()
  If ElapsedMilliseconds() - lastRunMs  > 1000
    lastRunMs  = ElapsedMilliseconds()
    Timer  - 1
    
    ;If the Users Time Attack Timer Has Expired
    If Timer  = 0
      Done  = 1
    
    ;Play the Explosion.wav Sound if sound_effects are possible and the player hasn't muted sounds
    If ((Sound_Possible  = 1)And (Mute  = 0))
      PlaySound(3,  0)
    EndIf
    
    EndIf
  
  EndIf
EndProcedure

Procedure TwoPlayerGame()
  ;If the window was opened successfully
  If OpenWindow(0, 0, 0, 480, 640, "Pong Master v0.1 - Two Player", #PB_Window_SystemMenu)
    
    ; Now, open a 640*480 - 16 bits (65000 colours) screen
    OpenWindowedScreen(WindowID(0),  0, 0, 480, 640, 0, 1, 1)
    
    ;Load the Sprites into Memory
    LoadSprites()
    
    ;Load the Sound Effects into Memory
    LoadSounds()
    
    ;Reset The Scores
    ResetScores()
    
    ;Position the Sprites
    PositionObjects()
    
    ;Set Done to 0
    Done  = 0
    
    ;start the game loop
    Repeat
      
      ;Process Window Events
      Event  = WindowEvent()
      
      ;if the user tries to close the window then go to the title screen
      If Event  = #PB_Event_CloseWindow
        Done  = 1
      EndIf
      
      ;Delay the game 1 millisecand
      Delay(1)
      
      ;Game Interface Procedures
      CheckForMute()
      CheckForPause()
      BallBouncing()
      MoveBall()
      Player1Movement()
      Player2Movement()
      PrintScores()
      CDPlayer()
      
      ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
      
      FlipBuffers()
      
      ;increase the loop counter by 1
      loopcounter  + 1
      ;if the game has looped 50 times then delay for 1 second
      If loopcounter  > =dynamic_delay_set
        Delay(1)
        loopcounter  = 0
      EndIf
      
    Until KeyboardPushed(#PB_Key_Escape)Or Done  = 1
    
    ;the player just won so wait a few secs so the player can see the win message
    Delay(1000)
    
    ;The game is finished so remove all the sprites and sounds from memory
    CleanUp()
    
    ;and close the window
    CloseWindow(0)
    
    ;close the current screen
    CloseScreen()
    
    ;and reopen the title screen
    TitleScreen()
    
  Else
    
    ;otherwise let the user know the window couldn't be opened
    MessageRequester("Error",  "Can't open a 480*640 - 16 bit screen !", 0)
  EndIf
  
  ;remove all the sprites And sounds from memory
  CleanUp()
EndProcedure
;ExecutableFormat=Windows
;Executable=C:\Projects\Pong Master - Pure BASIC\Pong Master.exe
;EOF

Posted: Sun Mar 19, 2006 5:12 am
by Dark Mars Software
Why is it my topic always goes MIA after a single reply?

Posted: Sun Mar 19, 2006 10:35 am
by Comtois
in the procedure DemoTimer comment these lines

Code: Select all

  ;check for mouse movement
;   If ExamineMouse()
;  
;   ;If mouse is moved left
;   X_Movement = MouseDeltaX()
;   If X_Movement  < 0
;   ;Then reset the timer
;   DemoTimer = 0
;   Else
;   ;otherwise If the mouse is moved right
;   If X_Movement > 0
;   ;Then reset the timer
;   DemoTimer = 0
;       EndIf
;     EndIf
;    
;    EndIf
if you need mouse ,use WindowMouseX() and WindowMouseY()
And check mouse with event.

If Event = #WM_LBUTTONDOWN
do something

ElseIf Event = #WM_RBUTTONDOWN
...
EndIf

Posted: Sun Mar 19, 2006 10:38 am
by blueznl
could we next time boil it down to a snippet? i don't mind long code, but this is a bit over the edge...

Posted: Sun Mar 19, 2006 11:08 pm
by Dark Mars Software
Comtois wrote:in the procedure DemoTimer comment these lines

Code: Select all

  ;check for mouse movement
;   If ExamineMouse()
;  
;   ;If mouse is moved left
;   X_Movement = MouseDeltaX()
;   If X_Movement  < 0
;   ;Then reset the timer
;   DemoTimer = 0
;   Else
;   ;otherwise If the mouse is moved right
;   If X_Movement > 0
;   ;Then reset the timer
;   DemoTimer = 0
;       EndIf
;     EndIf
;    
;    EndIf
if you need mouse ,use WindowMouseX() and WindowMouseY()
And check mouse with event.

If Event = #WM_LBUTTONDOWN
do something

ElseIf Event = #WM_RBUTTONDOWN
...
EndIf
Thats not it, the problem is with the code comtois game me:

Code: Select all

;if the window was opened successfully 
  If OpenWindow(#MainMenu, 216, 0, 209, 216, "Pong Master - Main Menu", #PB_Window_SystemMenu  | #PB_Window_TitleBar  | #PB_Window_ScreenCentered) 
      OpenWindowedScreen(WindowID(#MainMenu),0,0,209,216,1,0,0)    ; <<<< Added 
    ;create gadget list
The problem is solved and the function works, but the side effect is the mouse cursor dissappears when the player reaches the titlescreen, whereas if i commented that code the function wouldn't work, but the mouse cursor can be seen.

Posted: Fri Mar 24, 2006 10:35 pm
by Dark Mars Software
No one is willing to help me?

Posted: Sat Mar 25, 2006 12:44 pm
by Pupil
Dark Mars Software wrote:No one is willing to help me?
What you have to understand is that people on the forum provide help on their free time and is not getting any compensation out of it other than the satisfaction of helping oneother. So when someone asks something that looks too much like work(i.e. something that you ought to get paid to do), i at least tend to rather jump to next topic than take the time to solve the problem(there are of course exceptions, i.e. if i have worked with the same problem or if the topic interest me in general).

This is all general speaking, now if we take your posts, to me they seem to much like work, do you seriously expect someone to read through aprox 1300 lines of code!! To be able to help you one needs to read through the code, decipher the way you code(not everyone have the same coding style) then locate where the problem is and then solve the problem..

To increase the chance of getting help you absolutely need to shorten the code you post to a working snippet that shows what the problem is.. Otherwise you'll constantly be asking the question i quoted you on.

Posted: Sat Mar 25, 2006 4:43 pm
by blueznl
Dark Mars Software wrote:No one is willing to help me?
looks like it :-)

boil the question down to a few lines, grovel a bit on one side, slime a bit on the other, call sparky fred's avetar and don't discuss fanglez' size, and you're halfway there!

Posted: Sat Mar 25, 2006 5:51 pm
by Dark Mars Software
Ok, the problem is after a demo game is exited, the mouse cursor goes behind the TitleScreen Window.