/* AstroPong - A 3D Pong Game Copyright (C) 2002 Oliver Baker This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA For further information visit http://plib.sourceforge.net $Id: astropong.psl 1699 2002-09-22 15:22:21Z sjbaker $ */ #define ARENA_SIZE 8.0 /* meters */ #define ARENA_LENGTH 10.0 /* meters */ #define BALL_SIZE 2.5 /* meters */ #define BOUNCE (ARENA_SIZE/2.0 - BALL_SIZE/2.0) #define BOUNCEY (ARENA_LENGTH/2.0 - BALL_SIZE/2.0) #define BAT_SIZE (1.0 + BALL_SIZE/2.0) /* From the center to the sides */ int arena ; int shadow ; int difficulty ; int scoreBoardR ; int scoreBoardB ; int ball ; int bPaddle ; int rPaddle ; int camera ; int scoreR ; int scoreB ; float Blue_batspeed = .34; float scoreSpinR ; float scoreSpinB ; float ballSpinH ; float ballSpinSH ; float ballSpinP ; float ballSpinSP ; float ballSpinR ; float ballSpinSR ; float ballX ; float ballY ; float ballZ ; float ballSX ; float ballSY ; float ballSZ ; float bpaddleX ; float bpaddleZ ; float rpaddleX ; float rpaddleZ ; float userX ; float userZ ; int frameno = 0 ; int main() { camera = 0 ; arena = siLoad ( "arena2.ac") ; ball = siLoad ( "ball3.ac") ; bPaddle = siLoad ( "bluepaddle2.ac"); rPaddle = siLoad ( "redpaddle2.ac") ; scoreBoardR = siLoad ( "Scoreboard.ac") ; scoreBoardB = siLoad ( "Scoreboard.ac") ; shadow = siLoad ( "shadow2.ac") ; scoreSpinR = 0 ; scoreSpinB = 0 ; ballSX = 0.166 ; ballSY = 0.155 ; ballSZ = 0.016 ; ballSpinSH = 4 ; ballSpinSP = 4 ; ballSpinSR = 4 ; difficulty = 1 ; if ( difficulty == 1 ) { Blue_batspeed = .275 ; } else { Blue_batspeed = .34 ; } while ( 1 ) { frameno = frameno + 1 ; /* Read the joystick */ userX = siJoystickLR(); userZ = siJoystickUD(); /* Move the ball */ ballX += ballSX ; ballY += ballSY ; ballZ += ballSZ ; ballSpinH += ballSpinSH ; ballSpinP += ballSpinSP ; ballSpinR += ballSpinSR ; /* Bounce off the sides? */ if ( ballX > BOUNCE || ballX < -BOUNCE ) { ballSX = -ballSX ; } /* Bounce off the top and bottom? */ if ( ballZ > BOUNCE || ballZ < -BOUNCE ) { ballSZ = -ballSZ ; } /* What happens at the ends? */ if ( ballY > BOUNCEY ) /* Passed the blue paddle? */ { /* Is the blue bat there? */ if (ballX > bpaddleX - BAT_SIZE && ballX < bpaddleX + BAT_SIZE && ballZ > bpaddleZ - BAT_SIZE && ballZ < bpaddleZ + BAT_SIZE ) { float hitX = ballX - bpaddleX ; float hitZ = ballZ - bpaddleZ ; if ( ballSX > 0 ) ballSX = fabs ( hitX / 2.0 ) ; else ballSX = -fabs ( hitX / 2.0 ) ; if ( ballSZ > 0 ) ballSZ = fabs ( hitZ / 2.0 ) ; else ballSZ = -fabs ( hitZ / 2.0 ) ; ballSY = -ballSY ; } else { scoreR++ ; print ("The score is Red:", scoreR, " Blue:", scoreB, "\n" ) ; ballSX = 0.1 ; ballSY = 0.1 ; ballSZ = 0.1; ballSY = -ballSY ; ballX = 0.0 ; ballY = 0.0 ; ballZ = 0.0; for ( int i = 0 ; i < 60 ; i++ ) pause ; } } if ( ballY < -BOUNCEY ) /* Passed the red paddle? */ { /* Was the red bat there? */ if (ballX > rpaddleX - BAT_SIZE && ballX < rpaddleX + BAT_SIZE && ballZ > rpaddleZ - BAT_SIZE && ballZ < rpaddleZ + BAT_SIZE ) { float hitX = ballX - rpaddleX ; float hitZ = ballZ - rpaddleZ ; if ( ballSX > 0 ) ballSX = fabs ( hitX / 2.0 ) ; else ballSX = -fabs ( hitX / 2.0 ) ; if ( ballSZ > 0 ) ballSZ = fabs ( hitZ / 2.0 ) ; else ballSZ = -fabs ( hitZ / 2.0 ) ; ballSY = -ballSY ; } else { scoreB++ ; print ("The score is Red:", scoreR, " Blue:", scoreB, "\n" ) ; ballSX = .1 ; ballSY = .1 ; ballSZ = .1; ballSY = -ballSY ; ballX = 0.0 ; ballY = 0.0 ; ballZ = 0.0; for ( int i = 0 ; i < 60 ; i++ ) pause ; } } /* Update the scoreboard */ scoreSpinR = scoreR * -36.0 ; scoreSpinB = scoreB * -36.0 ; /* How should the computer move the paddle? */ if ( ballZ > bpaddleZ ) { bpaddleZ += Blue_batspeed ; } else { bpaddleZ -= Blue_batspeed ; } if ( ballX > bpaddleX ) { bpaddleX += Blue_batspeed ; } else { bpaddleX -= Blue_batspeed ; } /* How did the player move the paddle? */ rpaddleX += userX * -.5; rpaddleZ += userZ * .5; /* Did the paddle move off the edge of the screen? */ if ( rpaddleX > BOUNCE ) rpaddleX = BOUNCE ; if ( rpaddleX < -BOUNCE ) rpaddleX = -BOUNCE ; if ( rpaddleZ > BOUNCE ) rpaddleZ = BOUNCE ; if ( rpaddleZ < -BOUNCE ) rpaddleZ = -BOUNCE ; /* Tell SIMON where to position the paddle, ball and camera */ /* MODEL X, Y, Z, H, P, R */ siPosition ( scoreBoardR, 1, 0, 0, 0, scoreSpinR, 0 ) ; siPosition ( scoreBoardB, -1, 0, 0, 0, scoreSpinB, 0 ) ; siPosition ( bPaddle , bpaddleX, 5, bpaddleZ, 0, 0 , 0 ) ; siPosition ( rPaddle , rpaddleX, -5, rpaddleZ, 0, 0 , 0 ) ; siPosition ( ball , ballX, ballY, ballZ, ballSpinH,ballSpinP,ballSpinR); siPosition ( arena , 0, 0, 0, 0, 0 , 0 ) ; siPosition ( shadow , ballX, ballY, -4, 0, 0 , 0 ) ; siPosition ( camera , 0, -10, 0, 0, 0 , 0 ) ; pause ; } }